2013-01-07 13 views
5

私はAndroid上で簡単な無限スクロールGridViewを実装しました。Androidの無限スクロールグリッド、アダプタが無期限に拡張する必要がありますか?

  1. GridViewのは非常に下にスクロールされるたびにonScrollListener、とGridViewのは、私は私のアダプターに複数のアイテムをロードするためのAsyncTaskをキックオフ:私は、次のコンポーネントがあります。
  2. AsyncTaskからフェッチされた項目を追加し、NotifyDataChanged()を起動してGridView自体をリフレッシュできるようにするアダプタ。

これは、アダプタが無期限に成長している場合を除いて、うまくいくようです...ユーザーが最後までスクロールするたびにこのアダプタにアイテムを追加し続けることになります。これはメモリの問題です。

エンドレスアダプターを実装する適切な方法は何ですか?私はコンセプトを探しています。サードパーティ製の瓶ではありません。

ソリューション

おかげでマーク答えは右の理論を持っています。私の実装では、ロードされたデータをsqlliteデータベースにバックアップするので、全体的な流れは次のとおりです。インターネットからのデータをスレッドでダウンロードし、解析してスレッドにデータベースに格納し、UIスレッドでnotifyDataChangedを発生させます。
アダプターのgetCount()メソッドは、単にデータベースからselect count(id)を実行し、データベースからメモリー内に一度にオブジェクトのバッチを取り出して、アダプターが使用するようにします。

+0

hi。任意のチャンスでこの問題を解決し、いくつかのコードを投稿できますか? – OWADVL

+0

はい、私は* solution * – Chao

答えて

3

通常、GridViewが無限大の場合、Adapterは無限大です。より多くのデータをメモリに読み込むだけの単純な実装をしているなら、ある時点でメモリの問題に遭遇するでしょう。これを回避するには、ある時点で古いデータを解放する必要があります。

あなたのアダプタが(たいていはインターネットから)データを取得するいくつかの「無限」のストアにアクセスできると仮定すると、メモリ内に保持するデータの最大サイズ(バイト数またはアイテム数)を設定することを検討できます。あなたのアダプター。最大サイズを超えると、古いアイテムをメモリから削除することができます。これらの古いアイテムが再度リクエストされた場合は、メモリからではなく無限ストアから再度読み込みます(おそらく他の古いアイテムはメモリからパージされます)。

これはあなたのGridView項目がいくつか(おそらく外部)ストアによって裏打ちされたキャッシュのいくつかの並べ替え(LruCacheはここで役に立つかもしれません)にデータを格納するAdapterから構築されることを意味します。また、メモリキャッシュと外部ストアの間にディスクキャッシュを置くこともできます。

+0

の元の質問に私の最終的なアプローチを置きました。これは間違いなく鐘を鳴らし、私はこれを実装して報告するつもりです。ありがとう! – Chao

関連する問題