Поиск проверенного состояния флажка в пользовательском listview

#android #listview #checkbox

#Android #listview #флажок

Вопрос:

Хай я пытаюсь разработать приложение, с помощью которого я мог бы отправлять sms и электронную почту определенной группе людей..

У меня есть listview, показывающий контакты, которые находятся в моей группе.Каждая строка имеет вид

TextView (имя) TextView (телефон) Флажок (sms)
TextView (идентификатор электронной почты) Флажок (почта)

Я использовал пользовательский адаптер для отображения контактных данных в listview.я установил прослушиватель onitemclick для поиска позиции строки.. Я должен отправлять sms и электронную почту тем контактам, для которых флажки установлены как true.как я могу найти состояние каждого из флажков?

Пожалуйста, помогите мне .. заранее благодарю..

Я добавил ниже пользовательский адаптер, который я создал..

открытый класс 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;
}
 

}

Класс ContactInfo является :

публичный класс ContactInfo {

 public String name;
public String number;
public String email;
public boolean sms_state;
public boolean email_state;
public ContactInfo(){
    super();
}

public ContactInfo(String name,String number,String email,boolean sms_state,boolean email_state) {
    super();

    this.name   = name;
    this.number = number;
    this.email  = email;
    this.sms_state = sms_state;
    this.email_state = email_state;
}
public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setNUmber(String number) {
    this.number = number;
}

public String getNumber() {
    return number;
}

public void setEmail(String email) {
    this.email = email;
}

public String getEmail() {
    return email;
}
public void setSms_state(Boolean sms_state)
{
    this.sms_state = sms_state;
}
public Boolean getSms_state(){
    return sms_state;
}
public void setEmail_state(Boolean email_state)
{
    this.email_state = email_state;
}
public Boolean getEmail_state(){
    return email_state;
}
 

Комментарии:

1. Привет, ребята … я понял … спасибо за помощь…

2. Чтобы получить отмеченные состояния флажков, которые нам нужно сделать: listview.getAdapter().data

Ответ №1:

Внутри getView() метода вы должны реализовать a OnCheckedChangeListener для флажка.

Вот код прослушивателя, скажем, например:

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

    }
});
 

Комментарии:

1. верно! но я думаю, что должен быть шаблон проектирования, в котором, если в строке списка есть флажок, состояние флажка должно быть изменено при нажатии на всю строку списка, а не только на сам флажок.

2. Я реализовал это .. но мне нужно знать, как я могу получить arraylist, в котором я храню эти значения, на странице активности.

Ответ №2:

См. Документ.

Я думаю, вам нужно :

 
checkbox.isChecked()
 

Ответ №3:

Вот простой пример:

 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()) {
                ...
            }
});
 

Комментарии:

1. обратите внимание, это будет работать для щелчка по всему списку, только если вы установите правильные параметры для своего флажка:

2. <Флажок android: id=»@ id/listrow_contact_chkConteact» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android: кликабельный =»false» android: фокусируемый =»false» />

3. Да .. я установил флажок focusable как false, а listview focusable как true .. мне нужно знать, как я могу повторно использовать значения в arraylist, в которые я сохраняю состояния флажков.

4. почему бы вам не создать новый список<Contact> readyForSendingContacts и List.add внутри if (chkContact.IsChecked()){…}? Это также эффективно, когда вы предоставляете пользователю проверку подтверждения. В противном случае вы могли бы добавить логическое значение IsChecked в свой контактный POJO, но ИМХО в этом нет необходимости. Также помните, что вы не можете полагаться на ChkBx.IsChecked, пока он находится внутри (массива?) Адаптер и ChkBx не полагаются на контактный POJO…

Ответ №4:

У меня была эта проблема с моим приложением Hasta La Vista, я создал пользовательский listview с проверенными элементами, и мне нужно было получить проверенные элементы, это было решение:

     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);

            }
        }

    }
 

Ответ №5:

Поскольку представления ListView перерабатываются, вы не можете полагаться на прослушивание конкретного экземпляра, вам придется сохранить «проверенное» состояние в вашей модели данных. Вам также понадобится пользовательский адаптер списка, в котором вы создаете и заполняете отдельные записи. Необходимо выполнить следующее: — в переопределенном getView() либо создать новое представление (в случае, если convertView не был предоставлен), либо создать новое — заполнить поля viewv из вашей модели данных — удалить старый прослушиватель onclick и установить новый (может быть анонимный внутренний класс), модифицирующий вашу модель данных

PS: повторное использование представлений важно, если ваш список большой

Комментарии:

1. У меня есть пользовательский интерфейс для заполнения listview .. и в getView() я использовал arraylist для хранения логического значения флажков, установив прослушиватель checkedchange. как я могу получить этот массив для действия.

2. Я понятия не имею, так как я не видел ваш код. Опубликуйте его, тогда кто-нибудь может вам помочь