3

我正在尝试使用游标在 ListView 中显示预填充数据库(超过 100000 行)中的所有项目。它可以工作,但应用程序需要几分钟才能启动并显示 ListView。有更快的方法吗?我读过一些关于 FTS3 表的内容,这有帮助吗?

我正在使用ArrayList<HashMap<String, String>>SimpleAdapter 和自定义 2 行布局。代码:

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
                }
            });
        }
4

4 回答 4

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
    }
}
于 2013-01-28T16:41:00.630 回答
0

这应该在带有某种过滤的部分中,加载这么多项目似乎只是为什么过度。

于 2013-01-28T16:41:12.983 回答
0

我不太确定,但恐怕您的问题是您同时加载了 100.000 个视图。我个人会使用 ArrayAdapter 或基本适配器,覆盖 getView(..) 方法,当然还有使用 ViewHolder 模式。

在这里,您使用 BaseAdapter 获得了一个非常流畅和快速的示例: https ://github.com/Jachu5/RSS_Feeder_Android/tree/master/RssFeeder_sherlock/src/com/example/adapter

希望能帮助到你!

于 2013-01-28T16:47:05.670 回答
0

你为什么要加载 100K 项目到列表视图中?列表视图是一个屏幕元素,将与用户进行交互。没有人会滚动浏览 10 万个项目。甚至没有人会滚动浏览其中的 1%。这里的答案是不要全部加载它们。

于 2013-01-28T16:53:54.120 回答