ListView与自定义布局

时间:2015-02-10 10:38:12

标签: android android-layout listview android-listview

我有一个带有自定义布局的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;
}
}
问题是,当我选中一行中的复选框时,也会检查第七个嵌套复选框。 为什么会这样? 整行不重复。数据显示清楚,但只检查复选框重复。

还有一件事我如何获得点击行的布局。 我希望当用户点击该行时,将选中该复选框。

提前感谢,因为从这么多代码中找到问题是非常勇敢的工作。感谢

1 个答案:

答案 0 :(得分:0)

由于列表视图的列表视图行可能重复使用,因此您的convertView可能是之前已经检查过的项目。

您必须明确地写下类似的内容:

boolean isChecked = _Mode != "";
MyHolder.CheckedContact.setChecked(isChecked); 

请注意:您的代码有几个问题。不要使用getView()方法访问您的数据库。相反,首先将项目存储到适配器中的数组/列表中,然后只需在getView()方法中调用list.get(position)。

此外,您不需要将上下文存储为适配器中的字段,因为您可以在需要时调用parent.getContext()。 通常,getView()方法应尽可能快地运行以允许平滑滚动。

最后,如果您遵循Java Code Conventions

,您的代码将更具可读性