7

バックグラウンド

PinterestLikeAdapterView ライブラリを使用して、インターネットからいくつかの画像を表示しています。これは gridView に似ていますが、セルごとに高さが異なります。

問題

このライブラリを使用してインターネットから画像を表示するため、notifyDatasetChanged を呼び出すときにビューが混乱しないようにすることが重要です。

何らかの理由で、この関数を呼び出すと、ビューの位置が異なる getView() メソッドが呼び出されます。たとえば、まったくスクロールせず、notifyDatasetChanged (または ArrayAdapter の場合は addAll) を呼び出しても、位置 0 の場合は位置 8 のビューを取得し、位置 1 の場合は位置のビューを取得します7 など...

これにより、グリッド全体が画像を更新するようになり、UX が台無しになります。

通常、gridView と listView の両方で、更新を克服する方法は、viewHolder 内のビューに使用された位置を配置することであり、それらが等しい場合は、それらがまだ一致していることを意味します。

例えば:

... getView(...)
  {
  //<=inflate a new view if needed 
  //avoid refreshing view in case it's still the same position:
  if(position==holder.position)
    return rootView;
  holder.position=position;
  //<=update the view according to its data
  ...
  }

ただし、ここでは別のビューを別の順序で再利用するため、このトリックはここでは機能しません。

この問題により、表示されているほとんどすべてのビューが更新されるだけでなく、 DiskCacheLruライブラリを使用しているため、2 つのスレッドを使用して 2 つの同一の inputSteam データを同じキーに入れようとするため、クラッシュします。

質問

私に何ができる?これはライブラリの既知のバグですか?

多分私はリフレッシュを克服するために悪い方法を使用していますか?

今のところ、メモリキャッシュを使用して、少なくとも以前にキャッシュされたアイテムを取得しますが、それは「ワクチン」というよりは「治療」に似ています...

4

4 に答える 4

1

View getView(int position, View view, ViewGroup parent)の後、常に昇順で呼び出されnotifyDataSetChanged()ます。
ダウンロードタスクを終了する順序がこの問題を引き起こすと思います。
質問で述べたように、ポジションを維持することは、この問題を回避するための良い方法です。

これを解決する別の方法があります。また、イメージビューを再利用します。

ImageViewダウンロード タスクでは、それぞれの弱参照を保持します。
次に、ダウンロード タスクをダミーでラップしますColorDrawable
が呼び出されたらgetView、ダミーColorDrawableをに設定しImageView、ダウンロードを開始します。ダウンロードが完了したら、ダウンロードしたイメージを の参照ImageViewに戻しますOnPostExecute()

解説
http://android-developers.blogspot.jp/2010/07/multithreading-for-performance.html
ソースコード
https://code.google.com/p/android-imagedownloader/source/checkout

于 2013-10-09T03:22:51.747 に答える
0

GitHubのPinterestLikeListViewに非常に良い例があります

ここにライブラリStaggeredGridViewがあります

Android の実験的な StaggeredGridView の修正版。独自の OnItemClickListener と OnItemLongClickListener、セレクター、固定位置の復元が含まれます。

ここでライブラリプロジェクトを取得できますライブラリ

ここでデモプロジェクトを入手できます

これは非常に優れたオープン ソース プロジェクトなので、 PinterestLikeAdapterViewの代わりに使用できます。

ここに画像の説明を入力

このライブラリがあなたを助けてくれることを願っています。

于 2013-10-20T15:38:19.783 に答える