listview
ArrayAdapter へのバインドを作成する小さなプロジェクトに取り組んでいます。getView()
ArrayAdapterの関数ではurls
、スレッド上で Web から画像をロードし、それらをリスト項目に設定します (もちろん位置に基づいているため、url[0]
画像はlist_item[0]
etc に設定されます)。それはすべてうまくいくようです。
ただし、アプリをテストしていたときに、リストビューが完全に表示されるのを待ってから、前後に高速スクロールを実行すると、あるリスト項目の画像が別のリスト項目の位置にずれることがあることに気付きました (中間状態にあるなど)。 . ただし、間違って表示されたアイテムを画面外にスクロールしてから戻すまで、消えません。
スレッドを使用してウェブをロードすることに関連しているかどうかはわかりませんがurl
、ローカル リソース フォルダからイメージをロードすると同じ問題が発生する可能性があります。
これは実際に私が関数について持っている質問につながりgetView()
ます. getView()
位置に基づいて表示するURLのバインディングと同じくらい簡単なので、ロジックは正しいと思います。getView()
また、アイテムを画面外にスクロールしてから戻すなど、呼び出される機会があればいつでも、リストアイテムが正しく表示されます。
私が理解していないのは、発生した問題 (中間状態のような) を説明する方法と、コードを記述するときにそれを回避する方法です。
アダプターのコードを下に貼り付けますが、質問はおそらく一般的なものだと思います。
@Override
public View getView(int position, View v, ViewGroup parent) {
ViewHolder viewHolder = null;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(layoutResourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.title = (TextView) v.findViewById(R.id.title);
viewHolder.description = (TextView) v.findViewById(R.id.description);
viewHolder.image = (ImageView) v.findViewById(R.id.image);
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) v.getTag();
}
listItem item = items[position]; //items is some global array
//passed in to ArrayAdapter constructor
if (item != null) {
viewHolder.title.setText(item.title);
viewHolder.description.setText(item.description);
if (!(item.imageHref).equalsIgnoreCase("null")) {
mDrawableManager.fetchDrawableOnThread(item.imageHref, viewHolder.image);
} else {
viewHolder.image.setImageDrawable(null);
}
}
return v;
}
}
static class ViewHolder {
TextView title;
TextView description;
ImageView image;
}