从SQLite数据库在ListView中显示100000多个项目

时间:2013-01-28 16:30:35

标签: android android-listview android-sqlite

我正在尝试使用游标在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
                }
            });
        }

4 个答案:

答案 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%的内容。这里的答案是不加载它们。