3

カーソルを使用して、事前に入力されたデータベース (100000 行以上) のすべての項目を ListView に表示しようとしています。動作しますが、アプリが起動して 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アイテムをロードするより速い方法はありません。また、ユーザーは一度にすべてを表示する必要がないため、スレッドを使用してアイテムを1つずつロードします。

    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

よくわかりませんが、同時に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

これは、ある種のフィルタリングを備えたセクションにある必要があり、多くのアイテムをロードすることは、なぜ過剰になるのかと思われます。

于 2013-01-28T16:41:12.983 に答える
0

リストビューに 100K のアイテムをロードするのはなぜですか? リストビューは、ユーザーが操作する画面上の要素です。100K の項目をスクロールする人はいません。誰もその 1% もスクロールしません。ここでの答えは、それらすべてをロードしないことです。

于 2013-01-28T16:53:54.120 に答える