4
我正在使用自定義的ResourceCursorAdapter來顯示TextView和CheckBox的ListView。 TextView和CheckBox從Cursor獲取它們的狀態。我一直在遇到一些問題,最近的一個問題是,當我滾動一些行時,會從舊的TextView中獲取文本,而當它們不應該被選中時,會選中一些CheckBox。我已經添加了一個日誌行來看看發生了什麼,這只是讓我更困惑。如何防止再生的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
我已經通過將所有ViewHeader代碼投入bindView方法來解決重複項目的問題,這正是我之前所做的。現在我回到之前的一個問題,當我點擊一個複選框時,屏幕和數據庫中的狀態發生了變化,但是當我將它從屏幕上滾動並將其恢復到原始狀態時。有沒有辦法在創建狀態和重繪時設置狀態? (退出活動並返回顯示更改) – 2012-04-15 02:42:13
這是我在答案中顯示的代碼。創建一個數組來保存項目的狀態,並在你的bindView中引用。如果你看看我的代碼,你會看到我基於我的數組而不是直接分配按鈕文本和顏色。在進行更改時保持陣列更新,每次裝入視圖時都會正確設置狀態。 – Barak 2012-04-15 03:51:50