我有一个带有自定义布局的listView,我使用PlaceHolder概念来管理这些想法。 列表查看移动设备中所有联系人的列表。 并且布局使用户可以选择其中一些。
自定义布局包含文本框,图像和复选框
这是一个Array Adapter代码 我使用自己的ArrayAdapter并在其getView方法中填充字段 这是代码:
public class customContactAdapter extends ArrayAdapter<String> {
public final Activity context ;
public final List<String> ContactList;
public customContactAdapter(Activity context, int resource, List<String> objects)
{
super(context, resource, objects);
this.context= context;
this.ContactList= objects;
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
//View vi ;
//vi= convertView;
final ViewHolder MyHolder ;
if ( convertView==null){
MyHolder= new ViewHolder();
LayoutInflater inflater = context.getLayoutInflater();
convertView= inflater.inflate(R.layout.number_layout,null,true);
MyHolder.txtContact = (TextView) convertView.findViewById(R.id.ContactName);
MyHolder.RingMode = ( ImageView) convertView.findViewById(R.id.RingMode);
MyHolder.CheckedContact = (CheckBox) convertView.findViewById(R.id.checkbox);
MyHolder.MainLayout =(RelativeLayout) convertView.findViewById(R.id.MainLayout);
convertView.setTag(MyHolder);
}else{
MyHolder=(ViewHolder) convertView.getTag();
}
MyHolder.txtContact.setText(ContactList.get(position));
String _Mode="";
try{
DataBase db = new DataBase(context);
db.open();
_Mode= db.GetContactRow(ContactList.get(position));
db.close();
}catch(Exception e ){
Log.w("Error in getting mde from databse ",e.toString());
}
if (_Mode!=""){
Log.w("Contact is selected:","YES");
MyHolder.CheckedContact.setChecked(true);
if ( _Mode=="0"){
MyHolder.RingMode.setImageResource(R.drawable.silent3);
}else if (_Mode=="1"){
MyHolder.RingMode.setImageResource(R.drawable.vibration3);
}else if (_Mode=="2"){
MyHolder.RingMode.setImageResource(R.drawable.ring3);
}
}else {
MyHolder.RingMode.setImageResource(android.R.color.transparent);
}
if (position % 2 == 1)
{
MyHolder.MainLayout.setBackgroundColor(Color.parseColor("#E8E5E9"));
}
else{
MyHolder.MainLayout.setBackgroundColor(Color.parseColor("#C8E6C9"));
}
return convertView ;
}
public class ViewHolder{
private TextView txtContact;
private ImageView RingMode;
private CheckBox CheckedContact;
private RelativeLayout MainLayout;
}
}
问题是,当我选中一行中的复选框时,也会检查第七个嵌套复选框。
为什么会这样?
整行不重复。数据显示清楚,但只检查复选框重复。
还有一件事我如何获得点击行的布局。 我希望当用户点击该行时,将选中该复选框。
提前感谢,因为从这么多代码中找到问题是非常勇敢的工作。感谢
答案 0 :(得分:0)
由于列表视图的列表视图行可能重复使用,因此您的convertView
可能是之前已经检查过的项目。
您必须明确地写下类似的内容:
boolean isChecked = _Mode != "";
MyHolder.CheckedContact.setChecked(isChecked);
请注意:您的代码有几个问题。不要使用getView()
方法访问您的数据库。相反,首先将项目存储到适配器中的数组/列表中,然后只需在getView()
方法中调用list.get(position)。
此外,您不需要将上下文存储为适配器中的字段,因为您可以在需要时调用parent.getContext()
。
通常,getView()
方法应尽可能快地运行以允许平滑滚动。
最后,如果您遵循Java Code Conventions。
,您的代码将更具可读性