2011年07月20日

Android ListViewでスクロール時画面に消えたはずのアイテムが現れる現象について。

ListViewでカスタムしたアイテムを表示させる時はBaseAdapter等を使ってアイテムのViewをinflateさせる。

そこはいいんだが、問題はそのあと。
スクロールした際にスクロールアウトしたはずのアイテムが最後に出てきたり、逆にスクロールすると最後にあるはずのアイテムが現れたり、なんだかカオスになってしまうことがある。

なっかなかグーグル先生に聞き辛い内容なのだが解決方法をようやく見つけたのでメモっとく。

原因として、『ListViewはスクロールする時viewオブジェクトを再利用する』らしい。
これがスクロールアウトしたviewオブジェクトをそのまま再利用してケツにくっつけて書き出してると推測される。

下記がカオスってた時のgetViewメソッド。

public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null) {
//ここにviewのinitializeを全て書いてた。
//ただし、この方法だとviewがnullで無い場合もあるので再利用された時は滅茶苦茶になってしまう。
}
return view;
}

上記のようにview == nullの場合にのみviewを初期化するようにすると、再利用されたviewが直接出力されてしまうためカオスな状況になってしまう。

下記が修正版。

public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null) {
//ここではinflaterを使ってnullだった場合にのみviewをinitする。
view = inflater.inflate(R.layout.customview, null);
}

//getItemメソッドを使用してobjectを取得。
//存在した場合に上記で取得したviewの内容を書き換える。
Object object = getItem(position);
if(object != null) {
TextView text = (TextView)view.findViewById(R.id.text);
}
return view;
}


再利用したviewの内容を書き換えることで上記のような『スクロールアウトしたアイテムが表示される』問題が解決される。

参考URL
posted by 1.618 at 14:04| Comment(1) | Android | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
ListViewの再描画でたどり着きました。
参考になりました。ありがとうございます
Posted by ebinuma at 2014年01月22日 00:21
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: