私はカスタムのResourceCursorAdapterを使用してTextViewとCheckBoxを表示するListViewに取り組んでいます。 TextViewとCheckBoxは、Cursorから状態を取得します。私はそれにいくつかの問題を抱えていました。最も最近のことは、いくつかの行がスクロールするときに古いTextViewsのテキストがあり、いくつかのCheckBoxesが選択されていないときです。私は何が起こっているのかを見るためにログラインを追加しました。それはもっと混乱しています。リサイクルされたListViewアイテムに古いコンテンツが表示されないようにするにはどうすればよいですか?
@Override
public void bindView(View v, Context ctx, Cursor c) {
ViewHolder holder = (ViewHolder)v.getTag();
holder.tv.setText(holder.tvText);
holder.cb.setChecked(holder.checked);
Log.d(TAG, "in bindView, rowId:" + holder.rowId + " Scripture:" + holder.tvText);
}
。
@Override
public View newView(Context ctx, Cursor c, ViewGroup vg){
View v = li.inflate(layout, vg, false);
ViewHolder holder;
holder = new ViewHolder();
holder.tv = (TextView)v.findViewById(to[0]);
holder.tvText = c.getString(c.getColumnIndex(from[0]));
holder.cb = (CheckBox)v.findViewById(to[1]);
holder.rowId = c.getLong(c.getColumnIndex(from[2]));
holder.checked = (c.getString(c.getColumnIndexOrThrow(from[1])).equals("n")) ?
false : true;
holder.cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
View rowView = ((View)v.getParent());
ViewHolder holder = (ViewHolder)rowView.getTag();
holder.checked = (holder.checked == false) ? true : false;
smDb.setMemorized(holder.rowId);
rowView.setTag(holder);
Log.d(TAG, "check box clicked: " + holder.rowId);
}});
Log.d(TAG, "in newView, rowId:" + holder.rowId);
v.setTag(holder);
return v;
}
。
static class ViewHolder {
TextView tv;
String tvText;
CheckBox cb;
boolean checked;
Long rowId;
}
ログ出力
in newView, rowId:26
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in newView, rowId:27
in bindView, rowId:27 Scripture:Matthew 6:24
in newView, rowId:28
in bindView, rowId:28 Scripture:Matthew 16:15-9
in newView, rowId:29
in bindView, rowId:29 Scripture:Matthew 25:40
in newView, rowId:30
in bindView, rowId:30 Scripture:Luke 24:36-9
in newView, rowId:31
in bindView, rowId:31 Scripture:John 3:5
in newView, rowId:32
in bindView, rowId:32 Scripture:John 7:17
in newView, rowId:33
in bindView, rowId:33 Scripture:John 10:16
in newView, rowId:34
in bindView, rowId:34 Scripture:John 14:15
in newView, rowId:26
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
in bindView, rowId:26 Scripture:Matthew 5:14-6
私は以前に行っていたbindViewメソッドにすべてのViewHeaderコードを投げることでアイテムを繰り返すという問題を解決しました。今私は以前の問題に戻ってきましたが、CheckBoxをクリックすると、画面上とデータベース内の状態が変わりますが、画面からスクロールして戻すと元の状態に戻ります。作成時と再描画時に状態を設定する方法はありますか? (アクティビティを終了し、戻ってくると変更が反映されます) –
これは私の答えで示したコードです。項目の状態を保持する配列を作成し、bindViewを参照してください。私のコードを見ると、ボタンのテキストと色を、直接ではなく配列に基づいて割り当てることがわかります。変更を加えると配列が更新されたままになり、ビューをロードするたびに状態が適切に設定されます。 – Barak