我正在尝试使用游标在ListView中显示预填充数据库(超过100000行)中的所有项目。它可以工作,但是应用程序启动并显示ListView需要几分钟的时间。有更快的方法吗?我读过有关FTS3表的内容,会有帮助吗?
我正在使用带有SimpleAdapter和自定义2行布局的ArrayList<HashMap<String, String>>
。
代码:
Cursor cursor = sDictionary.query("FTSgesla", new String[] {PodatkovnaBaza.KEY_WORD, PodatkovnaBaza.KEY_DEFINITION}, null, null, null, null, PodatkovnaBaza.KEY_WORD);
if (cursor == null)
{
// There are no results
mTextView.setText("Empty");
}
else
{
HashMap<String, String> item;
if(cursor.moveToFirst())
{
do
{
item = new HashMap<String, String>();
item.put("line1", cursor.getString(0));
item.put("line2", cursor.getString(1));
list.add(item);
}
while(cursor.moveToNext());
}
sa = new SimpleAdapter(GlavniActivity.this, list,
R.layout.result,
new String[] { "line1","line2" },
new int[] {R.id.word, R.id.definition});
mListView.setAdapter(sa);
// Define the on-click listener for the list items
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//do something
}
});
}
答案 0 :(得分:7)
没有更快的方法来加载100000个项目,并且您的用户也不需要同时查看所有项目,因此,使用线程逐个加载它们。
private class SQLTask extends AsyncTask<Integer, String[], Integer> {
@Override
protected Integer doInBackground(Integer... params) {
db.open();
Cursor c = db.getAllDataCursor();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
String[] temp = new String[c.getColumnCount()];
for (int i = 0; i < temp.length; i++) {
temp[i] = c.getString(i);
}
publishProgress(thisTask, temp);
}
c.close();
db.close();
}
@Override
protected void onProgressUpdate(String[]... values) {
super.onProgressUpdate(values);
// LOAD ONE ROW
}
}
答案 1 :(得分:0)
这应该是某些过滤的部分,加载许多项目似乎为什么过度。
答案 2 :(得分:0)
我不太确定,但我担心您的问题是您同时加载了100.000次观看次数。 我个人会使用ArrayAdapter或基本适配器,覆盖getView(..)方法,当然还有ViewHolder模式。
使用BaseAdapter,您可以在这里获得非常流畅和快速的示例: https://github.com/Jachu5/RSS_Feeder_Android/tree/master/RssFeeder_sherlock/src/com/example/adapter
希望它有所帮助!
答案 3 :(得分:0)
为什么要将100K项目加载到列表视图中?列表视图是将由用户与之交互的屏幕元素。没有人会滚动100K项目。没有人会滚动1%的内容。这里的答案是不加载它们。