ListViewで大量のリストを表示する場合の順次読み込みについて

1,202 views
Skip to first unread message

エーアイサービス 徳山和宏

unread,
Aug 15, 2010, 2:50:09 AM8/15/10
to android-g...@googlegroups.com
こんにちは、徳山と申します。

今回は、ListViewについて質問させていただきたく投稿します。

以前、「serviceでのsensorEventListnerの使用について」で、
アドバイスいただいた方法で無事問題解決しまして、
AiSensor2Web という名称でAndroidマーケットに公開できました。

そのアプリでは取得したデータをListViewで表示しますが、
数百件程度から動作がだんだん重くなってきます。

具体的には、
ListViewでリストが表示されない空白の状態が何秒も続く状態です。


仕様上、蓄積データ数に上限を設けていないので、
端末に空き容量がある限りデータ蓄積していきます。

いずれ数千件以上になった際に、
アプリがうんともすんとも言わない状態で止まってしまい、
強制終了または待機のダイアログが出る状況になると思います。


それを避けるためには、
データベースからリスト表示部分だけを順次読み込みする方法に
切り替えるしかないと思いました。

ちょうど、「マーケット」アプリのリスト表示みたいな挙動が希望です。

一定以上スクロールすると次の数十行を読み込む形が、
端末への負荷が少ないと考えています。

良い方法をご存知の方がいらっしゃいましたらご教示ください。

なお、現在、次のようなコードでDBから一括取得しています。

よろしくお願いいたします。

---
DatabaseHelper dbHelper = new DatabaseHelper(DataListActivity.this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
DataDao dataDao = new DataDao(db);
datalist = dataDao.selectAll();
db.close();

listview = (ListView) findViewById(R.id.datalist);
listview.setAdapter(dataListAdapter);

for(Data data:datalist) {
dataListAdapter.addData(data.getRowid(),data.getCreatedTime(),data.getStatus());
}

dataListAdapter.notifyDataSetChanged();
---

Isher

unread,
Aug 15, 2010, 6:58:38 AM8/15/10
to 日本Androidの会
こんにちは。石井です。

ソースを見たところ、データベースから全件取得してリストに追加しているようですが、
この方法だと確かに件数が増えるに従って時間がかかると思います。

AdapterにSimpleCursorAdapter(http://developer.android.com/reference/
android/widget/SimpleCursorAdapter.html)を使い、
SQLiteDatabaseのqueryで得られるCursorをセットしれやれば、件数の増加にも耐えられると思います。
この方法であれば、数万件程度であれば重くなったりしないと思います。


On 8月15日, 午後3:50, エーアイサービス 徳山和宏 <kazuhiro_tokuy...@a-i-service.co.jp>
wrote:

エーアイサービス 徳山和宏

unread,
Aug 17, 2010, 2:51:46 AM8/17/10
to android-g...@googlegroups.com
石井様

こんにちは、徳山です。

SimpleCursorAdapterの件、アドバイスありがとうございます。

なんとか、BaseAdapterからSimpleCursorAdapterに乗り換えることができました。

BaseAdapterはリストにチェックボックスつけたり、
カスタマイズするために使っていたので、
はたしてそれらがSimpleCursorAdapterでも使えるのか不安でしたが、なんとか同様の動作をさせることができました。

唯一、SimpleCursorAdapterを使うために、
テーブルの項目名idを_idにする必要があり、
(ご教示いただいたリファレンスに書いてありました。)

SQLite3では項目名変更できないとのことで、
泣く泣く旧構造テーブル削除して、新構造テーブル追加することにしました。

おかげさまで、新バージョンを、さっそくAndroidマーケットに上げることができました。

ありがとうございました。


2010年8月15日19:58 Isher <mat...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

Reply all
Reply to author
Forward
0 new messages