我不确定我的代码中是否只有我或其他错误。我在自定义列表视图中填充所有电话联系人,一切都很好,直到填充。自定义列表视图有一个复选框,以便可以选择多个项目。问题是,当我在列表视图中加载30个联系人并选择第一个联系人时,我向下滚动,我看到第11个和第21个联系人也被选中。我不确定为什么会发生这种不寻常的问题中的任何信息会有所帮助。
这是xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawSelectorOnTop="false"
android:choiceMode="multipleChoice"/>
<TextView android:id="@+id/empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/main_no_contacts"
android:textColor="@color/white"/>
</LinearLayout>
自定义布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlContactListRowMain"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
<ImageView android:id="@+id/ivContactIconRow"
android:src="@drawable/droid_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RelativeLayout android:id="@+id/rlContactListRowChild"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ivContactIconRow"
android:layout_alignTop="@+id/ivContactIconRow">
<TextView android:text="Vikram Ramanathan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvRowContactName"
android:paddingLeft="10dip"
android:textColor="@color/white"/>
<TextView android:text="Phone Numbers: "
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dip"
android:id="@+id/tvRowContactPhone"
android:layout_below="@+id/tvRowContactName"
android:textColor="@color/white"/>
</RelativeLayout>
<CheckBox android:id="@+id/chkSelectContact"
android:layout_height="wrap_content"
android:text=""
android:layout_width="wrap_content"
android:layout_alignParentRight="true"></CheckBox>
</RelativeLayout>
java代码是
super.onCreate(savedInstanceState);
setContentView(R.layout.listcontacts);
phoneContactList = new ArrayList<PhoneContactInfo>();
this.m_adapter = new PhoneContactListAdapter(this, R.layout.listcontacts_row, phoneContactList);
setListAdapter(this.m_adapter);
适配器代码是
View v = convertView;
if (v == null)
{
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.listcontacts_row, null);
}
PhoneContactInfo phoneContactInfo = phoneContacts.get(position);
if (phoneContactInfo != null)
{
TextView tvContactName = (TextView) v.findViewById(R.id.tvRowContactName);
if (tvContactName != null)
{
tvContactName.setText(phoneContactInfo.getContactName());
}
TextView tvContactNumber = (TextView) v.findViewById(R.id.tvRowContactPhone);
if (tvContactNumber != null)
{
tvContactNumber.setText(phoneContactInfo.getContactNumber());
}
}
v.setTag(phoneContactInfo);
phoneContactInfo = null;
return v;
答案 0 :(得分:1)
我认为问题在于,当您填充项目时,您更新TextViews并且不更新CheckBox。您重复使用列表项的布局,这就是下一个项目选中CheckBox的原因。尝试为列表或自定义类中的每一个保存CheckBox状态并保存或从那里加载。
答案 1 :(得分:1)
我认为Mighter是对的。您可以通过删除if (v == null)
检查并且每次只从头开始重新创建视图来快速确认。当您使用循环视图时,您将(即convertView)确保在适当的时候重置所有视图。
根据此列表的性能级别,您可能还希望使用ViewHolder模式,而不是在每次调用getView()时调用findViewById。我推荐Google I / O 2010的这篇演讲,其中详细介绍了ListViews和适配器: http://www.youtube.com/watch?v=wDBM6wVEO70