我有一个继承ListActivity的活动,并显示一个通过XML布局和自定义适配器类填充的列表。这一切都很好,正如预期的那样。行XML包含一个复选框。
现在,奇怪的是,复选框似乎每隔很多行都会链接起来。也就是说,如果我检查第0行中的复选框,那么它还会检查第8,18,28,38,48行等中的复选框。
为什么会这样,我该如何解决?
如果相关,我我重新使用传递给我的适配器的视图。当我将其中一个选中的一个滚动到屏幕顶部时,似乎还有下一个要检查的是屏幕底部的第二个。
以下是我的getView
代码:
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.contacts_row, null);
}
cb.GroupMembership.moveToPosition(position);
long cid = cb.GroupMembership.getLong(0);
String clk = cb.GroupMembership.getString(1);
String cnm = cb.GroupMembership.getString(2);
long pid = cb.GroupMembership.getLong(3);
ImageView bdg = (ImageView) v.findViewById(R.id.contactBadge);
Uri pic = GroupsLib.getContactPhotoUri(pid);
if (pic == null) {
bdg.setImageResource(R.drawable.contactg);
} else {
bdg.setImageURI(pic);
}
((TextView) v.findViewById(R.id.contactName)).setText(cnm);
return v;
}
答案 0 :(得分:2)
当您重复使用视图时,您应该实际设置其中所有控件的状态(因此基本上是清理)。正是因为它被重复使用。
通常它看起来像(在适配器中):
public View getView (int position, View convertView, ViewGroup parent) {
SomeObject obj = getDataFromYourModel(position);
if (convertView == null) {
convertView = ....; //inflate view here
}
setMyViewParameters(obj,convertView);
}
public void setMyViewParameters(SomeObject obj, View view) {
CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox_id);
cb.setChecked(obj.isChecked);
//other initialisation
}
这样,您可以在重复使用视图时重置值。