Java 针对大量数据的ListView和CursorAdapter的性能问题
我在sqlite表中有大约4k行,该表有7列 我用自己的游标适配器创建了工作列表视图 查询如下Java 针对大量数据的ListView和CursorAdapter的性能问题,java,android,sqlite,Java,Android,Sqlite,我在sqlite表中有大约4k行,该表有7列 我用自己的游标适配器创建了工作列表视图 查询如下SELECT*FROM[table]ORDER BY[column]DESC 表有第一列\u id INTEGER主键,但排序由另一列完成 用于使用我自己的SQLiteOpenHelper 创建光标 mySQLiteOpenHelper pm = new mySQLiteOpenHelper(); SQLiteDatabase db = pm.getReadableDatabase(); Cursor
SELECT*FROM[table]ORDER BY[column]DESC代码>
表有第一列\u id INTEGER主键
,但排序由另一列完成
用于使用我自己的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);
}
及
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分钟,然后向下/向上滚动一个列表项大约需要一半时间。性能问题在哪里?我将创建一个自定义的适配器,它只加载活动视图所需的内容,并重用getView()方法中的视图。这真的很简单
更新
我发现了一个很好的例子,您应该能够使用:
是否为活动视图?您的意思是只加载屏幕位置上的行+的数据?我怎样才能做到这一点?是的,没错。只需重用已创建的视图,并仅使用当前列表视图位置的数据填充它们。安卓工程师Romain Guy有一段很棒的视频。大约12分钟开始:您能在回答中添加什么代码,然后在getView
、newView
和bindView
中添加吗?我会看的,但要把你的答案复杂化,这样我才能接受。因为getView
不是强制重写的,但是bindView
是肯定的,所以稍后我将添加一个更详细的答案。您不需要newView()
和bindView()
。请查看更新的答案。我添加了一个指向优秀教程的链接。如果你浏览光标并将元素添加到ArrayList中,你应该能够轻松地使用链接中的示例。为什么不使用日志记录来找到瓶颈?为什么有人对这两个答案都投了反对票?他们很有帮助@Arhimed您是什么意思?我的意思是您可以使用Log
类在LogCat中查看在哪个部分花费了多少时间。
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);
}
}
}