Android 具有自定义布局的ListView

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

我有一个自定义布局的列表视图,我使用占位符概念来管理这些想法。 列表查看手机上所有联系人的列表。 布局允许用户选择其中的一些

自定义布局由文本框、图像和复选框组成

这是一个数组适配器代码 我使用自己的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;
}
}
问题是,当我选中一行中的复选框时,嵌套第七个复选框也被选中。 为什么会这样? 整行没有重复。数据清晰显示,但仅复选框重复显示

还有一件事,我怎样才能得到点击行的布局。 我希望当用户单击该行时,复选框将被选中


提前感谢,因为从这么多代码中发现问题真是一项勇敢的工作。谢谢

因为listview可能会重用listview中的行,所以您的convertView可能是以前检查过的项目

您必须明确地编写如下内容:

boolean isChecked = _Mode != "";
MyHolder.CheckedContact.setChecked(isChecked); 
请注意:您的代码有几个问题。不要使用getView方法访问数据库。相反,首先将项目存储到适配器中的数组/a列表中,然后在getView方法中调用list.getposition

另外,您不需要将上下文作为字段存储在适配器中,因为您可以在需要时调用parent.getContext。 一般来说,getView方法应该尽可能快地运行以允许平滑滚动

最后,如果遵循下面的步骤,代码的可读性会更好