2011-10-04 22 views
3

我在sqlite表中有大約4k行,表中有7列。ListView和CursorAdapter對於大量數據的性能問題

我用我自己的CursorAdapter創建了工作ListView。

查詢是這樣SELECT * FROM [table] ORDER BY [column] DESC;

表具有第一列_id INTEGER PRIMARY KEY但順序由另一列完成。

對於使用我自己的SQLiteOpenHelper

創建光標

mySQLiteOpenHelper pm = new mySQLiteOpenHelper(); 
SQLiteDatabase db = pm.getReadableDatabase(); 
Cursor c = db.query([tablename], new String[]{"_id", "[column]", "[column]", "[column]", "[column]", "[column]"}, null, null, null, null, "name ASC"); 

它傳遞給ListView控件

ListView lv = (ListView) findViewById(R.id.list_items); 
lv.setOnItemClickListener(this); 
pa = new ItemsAdapter(ItemsActivity.this, c); 

在ItemsAdapter我已經重新實現

private LayoutInflater inflater; 

@Override 
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { 
    return inflater.inflate(R.layout.items_row, arg2,false); 
} 
子打開分貝

@Override 
public void bindView(View rtn, Context arg1, Cursor c) { 
    item_name = (TextView) rtn.findViewById(R.id.item_name); 
    item_description = (TextView) rtn.findViewById(R.id.item_description); 
    item_catalog_id = (TextView) rtn.findViewById(R.id.item_catalog_id); 
    item_true_price = (TextView) rtn.findViewById(R.id.item_true_price); 
    item_display_price = (TextView) rtn.findViewById(R.id.item_display_price); 
    item_button = (Button) rtn.findViewById(R.id.item_button); 

    item = new MyWrapClass(c); 

    // some work with item to fill up all UI items 

} 

MyWrapClass

public final class MyWrapClass { 

    public String name = ""; 
    public String notes = ""; 
    public int id = 0; 
    public String catalogId = ""; 
    public int price = 0; 
    public int publicPrice = 0; 
    public String groupPrice = ""; 
    public int order_count = 0; 

    public MyWrapClass(Cursor c) { 
     try { 
      id = c.getInt(0); 
      catalogId = c.getString(1); 
      name = c.getString(2); 
      price = c.getInt(3); 
      publicPrice = c.getInt(4); 
      groupPrice = c.getString(5); 
     } catch (Exception e) { 
      e.printStackTrace(System.err); 
     } 
    } 
} 

ListView中使用了相同的行初始化代碼,有它的工作非常好。

所以,如果你可以從這段代碼說,有什麼理由,爲什麼要加載6行項目(一個屏幕高度)和滾動刷新(意味着當你滾動一個項目)需要1分鐘?

只需加載ListView需要2分鐘,然後大約一半的時間向上/向下滾動一個列表項。性能問題在哪裏?

+0

什麼是 「MyWrapClass」? – dymmeh

+0

@dymmeh添加了其代碼 –

+0

爲什麼只是不使用日誌記錄以找到瓶頸? –

回答

2

我會創建一個自定義Adapter,只加載活動視圖所需的任何內容,並在getView()方法中重新使用視圖。這真的很簡單。

更新

我找到了一個很好的例子,你應該能夠使用: http://android.amberfog.com/?p=296

+0

爲活躍的意見?你的意思是隻加載行的數據+ - 在屏幕上的位置?我怎麼能做到這一點? –

+0

是的,正好。只需重新使用已創建的視圖,並僅使用當前列表視圖位置的數據填充它們。 Android工程師羅曼蓋伊有一個很棒的視頻。它開始於12分鐘左右:http://www.youtube.com/watch?v = UApv-ZMJ51g –

+0

你可以添加你的答案什麼代碼將在'getView','newView'和'bindView'?我要去看,但讓你的答案複雜,所以我可以接受它。因爲'getView'不是被強制覆蓋,而是'bindView'是 –