Android 具有自定义布局的ListView
我有一个自定义布局的列表视图,我使用占位符概念来管理这些想法。 列表查看手机上所有联系人的列表。 布局允许用户选择其中的一些 自定义布局由文本框、图像和复选框组成 这是一个数组适配器代码 我使用自己的ArrayAdapter并在其getView方法中填充字段 这是代码:Android 具有自定义布局的ListView,android,android-layout,listview,android-listview,Android,Android Layout,Listview,Android Listview,我有一个自定义布局的列表视图,我使用占位符概念来管理这些想法。 列表查看手机上所有联系人的列表。 布局允许用户选择其中的一些 自定义布局由文本框、图像和复选框组成 这是一个数组适配器代码 我使用自己的ArrayAdapter并在其getView方法中填充字段 这是代码: public class customContactAdapter extends ArrayAdapter<String> { public final Activity context ; publi
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;
}
}
问题是,当我选中一行中的复选框时,嵌套第七个复选框也被选中。
为什么会这样?
整行没有重复。数据清晰显示,但仅复选框重复显示
还有一件事,我怎样才能得到点击行的布局。
我希望当用户单击该行时,复选框将被选中
提前感谢,因为从这么多代码中发现问题真是一项勇敢的工作。谢谢因为listview可能会重用listview中的行,所以您的convertView可能是以前检查过的项目 您必须明确地编写如下内容:
boolean isChecked = _Mode != "";
MyHolder.CheckedContact.setChecked(isChecked);
请注意:您的代码有几个问题。不要使用getView方法访问数据库。相反,首先将项目存储到适配器中的数组/a列表中,然后在getView方法中调用list.getposition
另外,您不需要将上下文作为字段存储在适配器中,因为您可以在需要时调用parent.getContext。
一般来说,getView方法应该尽可能快地运行以允许平滑滚动
最后,如果遵循下面的步骤,代码的可读性会更好