【问题标题】:Check data when Scroll with the OnScrollListener in ListView (android)在 ListView (android) 中使用 OnScrollListener 滚动时检查数据
【发布时间】:2009-09-25 02:48:18
【问题描述】:

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

问题是CursorFor{} 语句 使我的程序变得更糟。 我想在用户滚动时显示第一个字符(来自两个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;
 }
}

【问题讨论】:

  • 为什么每次用户滚动时都要进行查询和 manageCursor 调用?您是否在滚动时加载新数据?否则,您应该只执行一次查询,并且可能使用 CursorAdapter 的变体。
  • 不,我不是说滚动时加载新数据。

标签: android listview


【解决方案1】:

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

您的操作方式是每次滚动ATALL时都会查询数据库中的所有记录。然后将所有这些值复制到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;
         }
    }
}

奖励积分...如果首先从Cursor 填充ListView(在这种情况下这似乎几乎可以肯定),您也许可以重复使用相同的Cursor 而不是拥有2 飘来飘去。

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多