【问题标题】:Displaying 100000+ items in ListView from SQLite database在 SQLite 数据库的 ListView 中显示 100000 多个项目
【发布时间】:2013-01-28 16:30:35
【问题描述】:

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

【问题讨论】:

    标签: android android-listview android-sqlite


    【解决方案1】:

    没有更快的方法来加载 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
        }
    }
    

    【讨论】:

    • 是否有一个 SQLite 命令可以从数据库中返回一个包含 1000 个随机值的游标?
    • sql没有随机数,但你可以使用准备好的语句和绑定来完成。
    • 我正在尝试使用您的代码,但是我应该在哪里以及如何在 ListView 中加载字符串?
    • 您首先创建您的列表和适配器,然后在 OnProgressUpdate() 中添加每一行;这个post 可能会有所帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      希望对你有帮助!

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-10
          • 1970-01-01
          • 1970-01-01
          • 2018-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多