背景:我有一個外語字典應用程序,運行良好,並有幾千安裝。但是,我對代碼不滿意,而且我試圖解決一些性能問題。代碼審查請求:Android使用SQLite光標
我越看越這段代碼,越是確信我沒有正確使用Android下的SQLite遊標。
這個概念是,當一個人鍵入英文或目標語言的字母時,光標從SQLite返回一個單詞,定義等列表。其中添加到列表適配器,它驅動列表視圖。但是,我一直在問自己,爲什麼我要遍歷遊標並用幾百個項目填充一個列表適配器,而在幾秒鐘內又會輸入另一個字符,並且整個列表都會發生變化。
我已經閱讀了startManagingCursor,但沒有看到它如何解決我的問題,並且在API 13下注意到現在有了整個CursorLoader概念。但是,我有一個真正的心理障礙。如果我沒有提前將行添加到適配器,我不明白如何在滾動期間填充ListView。
儘管我不想發佈整個應用程序,但我已經在此發佈了一個小代碼片段,並要求進行代碼審查,以幫助我瞭解自己做錯了什麼。
public class Dictionary extends Activity {
....
KeyAdapter keyadapter = new KeyAdapter();
List<KoshRow> koshRows;
KoshRowListAdapter laKoshRow = new KoshRowListAdapter(this, koshRows);
vListView.setAdapter(laKoshRow);
....
lots of stuff happens, and eventually in responding to a key press
...
Cursor c = null;
if (keyadapter.isEnglish)
c = db.lookupEnglish(ActualEntry, "%", ranges);
else
c = db.lookupPunjabi(ActualEntry, "*", ranges);
koshRows.clear();
if (c != null && c.moveToFirst()) {
do {
if (keyadapter.isEnglish)
koshRows.add(new KoshRow(c.getInt(0), -1, c.getString(1), c.getString(2)));
else
koshRows.add(new KoshRow(-1, c.getInt(0), c.getString(2), c.getString(1)));
} while (koshRows.size() < MAX_ROWS && c.moveToNext());
c.close();
...
laKoshRow.notifyDataSetChanged();
vListView.setSelection(0);