我的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;
}
}
答案 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个浮动。