Android 在自定义listview中查找复选框的选中状态

Android 在自定义listview中查找复选框的选中状态,android,listview,checkbox,Android,Listview,Checkbox,我正在尝试开发一个应用程序,通过它我可以向特定人群发送短信和电子邮件 我有一个列表视图,显示我组中的联系人。每一行都是 文本视图(姓名)文本视图(电话)复选框(短信) 文本视图(电子邮件id)复选框(邮件) 我已使用自定义适配器向listview显示联系人详细信息。我已设置onitemclick侦听器以查找行的位置。。 我必须向那些复选框设置为true的联系人发送短信和电子邮件。如何查找每个复选框的状态 请提前帮我一把 我已经在我创建的自定义adapetr下面添加了 公共类ContactInfo

我正在尝试开发一个应用程序,通过它我可以向特定人群发送短信和电子邮件

我有一个列表视图,显示我组中的联系人。每一行都是

文本视图(姓名)文本视图(电话)复选框(短信)
文本视图(电子邮件id)复选框(邮件)

我已使用自定义适配器向listview显示联系人详细信息。我已设置onitemclick侦听器以查找行的位置。。 我必须向那些复选框设置为true的联系人发送短信和电子邮件。如何查找每个复选框的状态

请提前帮我一把

我已经在我创建的自定义adapetr下面添加了

公共类ContactInfoAdapter扩展了ArrayAdapter{

private ArrayList<Boolean> mChecked_sms,mChecked_email;

Context context;
int layoutResourceId;   
ContactInfo data[] = null;

public ContactInfoAdapter(Context context, int layoutResourceId, ContactInfo[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId   = layoutResourceId;
    this.context            = context;
    this.data               = data;
    mChecked_sms = new ArrayList<Boolean>();
    mChecked_email = new ArrayList<Boolean>();
    for (int i = 0; i < this.getCount(); i++) {
        mChecked_sms.add(i, false);
        mChecked_email.add(i,false);
    }

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ContactHolder holder;
    View row            = convertView;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row                     = inflater.inflate(layoutResourceId, parent, false);

        holder          = new ContactHolder();

        holder.txtName  = (TextView)row.findViewById(R.id.textViewName);
        holder.txtPhone = (TextView) row.findViewById(R.id.textViewPhone);
        holder.txtEmail = (TextView) row.findViewById(R.id.textViewEmail);
        holder.cb_sms_state = (CheckBox) row.findViewById(R.id.checkBox1);
        holder.cb_email_state = (CheckBox) row.findViewById(R.id.checkBox2);
        row.setTag(holder);
    }
    else
    {
        holder  = (ContactHolder)row.getTag();
    }

    ContactInfo contact     = data[position];
    holder.txtName.setText(contact.name);
    holder.cb_sms_state.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (holder.cb_sms_state.isChecked()) {
                mChecked_sms.set(position, true);
                Toast.makeText(getContext(), "checked", 2).show();
            } else {
                mChecked_sms.set(position, false);
            }
        }

    });
    holder.cb_sms_state.setChecked(mChecked_sms.get(position));

    holder.cb_email_state.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (holder.cb_email_state.isChecked()) {
                mChecked_email.set(position, true);
                Toast.makeText(getContext(), "checked", 2).show();
            } else {
                mChecked_email.set(position, false);
            }
        }

    });
    holder.cb_email_state.setChecked(mChecked_email.get(position));

    holder.txtPhone.setText(contact.number);
    holder.txtEmail.setText(contact.email);

    return row;
}
static class ContactHolder
{

    TextView txtName;
    TextView txtPhone;
    TextView txtEmail;
    CheckBox cb_sms_state;
    CheckBox cb_email_state;
}

我认为你需要:


checkbox.isChecked()

getView()
方法中,必须为复选框实现一个
OnCheckedChangeListener

下面是一个侦听器代码,例如:

ChkBx.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
            // perform logic
        }

    }
});

以下是一个简单的示例:

mContactListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) {

            CheckBox chkContact = (CheckBox) view.findViewById(R.id.listrow_contact_chkContact);
            if (chkContact.isChecked()) {
                ...
            }
});
mContactListView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图视图、整型位置、长arg3){
复选框chkContact=(复选框)view.findViewById(R.id.listrow\u contact\u chkContact);
if(chkContact.isChecked()){
...
}
});

我的应用程序Hasta La Vista出现了这个问题,我创建了一个带有选中项的自定义列表视图,我需要获取选中项这是解决方案:

    ListView lv = getListView(); //ver listview
    if(lv != null){
        final SparseBooleanArray checkedItems = lv.getCheckedItemPositions(); //get checked items
        if (checkedItems == null) {
            return;
        }

        final int checkedItemsCount = checkedItems.size();
        for (int i = 0; i < checkedItemsCount; ++i) {
            // This tells us the item position we are looking at
            final int position = checkedItems.keyAt(i);
            // This tells us the item status at the above position
            final boolean isChecked = checkedItems.valueAt(i);

            if(isChecked){
                                    //get item from list and do something
                lv.getAdapter().getItem(position);

            }
        }

    }
ListView lv=getListView();//版本ListView
如果(lv!=null){
final SparseBooleanArray checkedItems=lv.getCheckedItemPositions();//获取选中项
if(checkedItems==null){
返回;
}
final int checkeditemscont=checkedItems.size();
对于(int i=0;i
由于ListView视图是循环使用的,您不能依赖于侦听特定实例,您必须在数据模型中存储“选中”状态。您还需要自定义列表适配器,在其中创建和填充单个条目。应执行以下操作: -在重写的getView()中,创建新视图(如果未提供convertView)或为新视图充气 -从数据模型填充viewv字段 -删除旧的onclick监听器,并在修改数据模型时设置新的监听器(可以是匿名内部类)


备注:如果列表很大,则循环视图很重要。注意,只有在为复选框设置正确的参数时,才可以单击整个列表:是。我将复选框设置为false focusable,将listview focusable设置为true。我需要知道如何在存储复选框状态的arraylist中检索值。为什么不创建新的List readyForSendingContacts和List.add inside if(chkContact.isChecked()){…}?当您给用户一个确认检查时,这也是有效的。否则您可以将boolean isChecked添加到您的联系人POJO中,但实际上这是不必要的。另外,请记住,当ChkBx.isChecked在(数组)中时,您不能依赖它适配器和ChkBx不依赖于联系人POJO…没错!但我认为应该有一种设计模式,如果列表行中有复选框,则复选框状态应该在单击整个列表行时更改,而不仅仅是复选框本身。我确实实现了这一点。但我需要知道如何检索arraylist,在其中我将这些值存储到activit我有一个自定义的apadter,用于填充listview..和getVIew()中的我使用arraylist通过设置checkedchange侦听器来存储复选框的布尔值。我如何才能将此数组检索到活动。我不知道,因为我没有看到您的代码。发布它,然后有人可能会帮助youHai伙计们…我得到了它…感谢您的帮助…获取我们要执行的复选框的CheckedState:listview.getAdapter().数据
mContactListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) {

            CheckBox chkContact = (CheckBox) view.findViewById(R.id.listrow_contact_chkContact);
            if (chkContact.isChecked()) {
                ...
            }
});
    ListView lv = getListView(); //ver listview
    if(lv != null){
        final SparseBooleanArray checkedItems = lv.getCheckedItemPositions(); //get checked items
        if (checkedItems == null) {
            return;
        }

        final int checkedItemsCount = checkedItems.size();
        for (int i = 0; i < checkedItemsCount; ++i) {
            // This tells us the item position we are looking at
            final int position = checkedItems.keyAt(i);
            // This tells us the item status at the above position
            final boolean isChecked = checkedItems.valueAt(i);

            if(isChecked){
                                    //get item from list and do something
                lv.getAdapter().getItem(position);

            }
        }

    }