使用ListView中的OnScrollListener滚动时检查数据(android)

时间:2009-09-25 02:48:19

标签: android listview

我的ListView(两个TextView,一个图标)有超过4000行,而且滚动速度非常慢。

问题是 {}声明Cursor使我的程序变得更糟。 我希望在用户滚动时显示第一个字符(来自两个TextView之一)。所以,任何解决方案都可以存档并使我的程序更好。 我的功能是这样的:

public void onScroll(AbsListView view, int firstVisibleItem, int VisibleItemCount, int totalItemCount){
 //int lastItem = firstVisibleItem + VisibleItemCount - 1;

 Cursor cursor = mDbHelper.loadTitleRaw();
 startManagingCursor(cursor);

 ArrayList<String> myArrayList = new ArrayList<String>();
 for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {
    String mTitleRaw = cursor.getString(cursor.getColumnIndex(SBooksDbAdapter.KEY_TITLE_RAW));
    myArrayList.add(mTitleRaw);
 }
 String[] mString = myArrayList.toArray(new String[myArrayList.size()]);          

 if(mReady){
  char firstLetter = mString[firstVisibleItem].charAt(0);
  if(!mShowing && firstLetter != mPrevLetter){
   mShowing = true;
   mDialogText.setVisibility(View.VISIBLE);
  }
  mDialogText.setText(((Character)firstLetter).toString());
  mHandler.removeCallbacks(mRemoveWindow);
  mHandler.postDelayed(mRemoveWindow, 3000);
  mPrevLetter = firstLetter;
 }
}

1 个答案:

答案 0 :(得分:1)

你几乎可以肯定这样做错了。您不希望在每个滚动上实例化新的Cursor,您想要创建一次,然后重复使用它。这通常在onCreate()方法中完成。你也可以摆脱整个ArrayList / Array混乱。

你正在做的事情是每次滚动 AT ALL 时,它会查询数据库中的所有记录。然后它将所有这些值复制到ArrayList,然后将所有值复制到数组中。你拿一个对象(带有一堆数据)然后把它变成一堆对象,每个对象都有很少的数据。除了不必要的重复之外,这可能会在垃圾收集中杀死你,更不用说一遍又一遍地运行查询了。你真的只想要一个数据的副本浮动,你想尽可能少的查询。

这样的事情应该有很多帮助:

public class MyActivity extends Activity {
    private Cursor cursor;

    public void onCreate(Bundle savedInstanceState) {
        // all the other stuff you're already doing.

        cursor = mDbHelper.loadTitleRaw();
        startManagingCursor(cursor);
    }

    public void onScroll(AbsListView view, int firstVisibleItem, int VisibleItemCount, int totalItemCount) {
         if(mReady){
             cursor.moveToPosition(firstVisibleItem);
             char firstLetter = cursor.getString(cursor.getColumnIndex(SBooksDbAdapter.KEY_TITLE_RAW)).charAt(0);

             if(!mShowing && firstLetter != mPrevLetter){
                 mShowing = true;
                 mDialogText.setVisibility(View.VISIBLE);
             }
             mDialogText.setText(((Character)firstLetter).toString());
             mHandler.removeCallbacks(mRemoveWindow);
             mHandler.postDelayed(mRemoveWindow, 3000);
             mPrevLetter = firstLetter;
         }
    }
}

奖励积分......如果首先从ListView填充Cursor(在这种情况下看起来几乎可以肯定),您可能只能重复使用Cursor {{1}} 1}}而不是2个浮动。