Переключить флажок программно

У меня есть ListView элементов, которые должны быть проверены/не проверены. Я настроил ArrayAdapter, который в настоящее время использует android.R.layout.simple_list_item_multiple_choice в качестве строки, и все отображается просто отлично. Я также могу правильно получить клики по этому элементу. Однако флажок в пользовательском интерфейсе не переключается при выборе элемента. Я пытался понять это некоторое время, может ли кто-нибудь указать мне правильное направление? Я просто хочу знать, как заставить пользовательский интерфейс обновляться, чтобы отразить измененное состояние флажка.

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

Спасибо!


person DashRantic    schedule 09.11.2011    source источник


Ответы (5)


Прежде всего просмотрите мой ответ: Просмотр списка Android с флажками?

Хорошо, если вы хотите реализовать отмеченные/не отмеченные флажки в ListView, вам просто нужно реализовать следующие строки в методе getView():

 // also check this lines in the above example
ViewHolder holder = (ViewHolder) view.getTag();
holder.checkbox.setChecked(list.get(position).isSelected());

Также проверьте метод getView() для реализации события CheckBox, находящегося внутри ListView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.rowbuttonlayout, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.label);
        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
        viewHolder.checkbox
            .setOnCheckedChangeListener(
                new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    Model element = (Model) viewHolder.checkbox
                            .getTag();
                    element.setSelected(buttonView.isChecked());
                }
            });
        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));
    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());
    holder.checkbox.setChecked(list.get(position).isSelected());
    // ......  
}
person Paresh Mayani    schedule 09.11.2011
comment
+1 я ваш подписчик, подскажите, пожалуйста, что мне делать (читать/смотреть), чтобы узнать больше об андроиде, как и вы.! спасибо .. многому научился из ваших ответов. - person MKJParekh; 09.11.2011
comment
Спасибо за добрые слова. Я всегда пытаюсь выучить тему за день и делаю ТАК и свой блог. что еще нужно для изучения новой темы :) , Откуда ты? - person Paresh Mayani; 09.11.2011
comment
Индия, я также делаю то, что прихожу в SO и нахожу по крайней мере одну тему, которую я не знаю, и получаю вопрос и ответ об этом ... но все же иногда мне становится скучно / надоело это делать ... но вы, ребята, продолжаете меня подбадривать. - person MKJParekh; 09.11.2011
comment
Спасибо за ваш ответ! Итак, вы говорите, что ни базовый класс ListView, ни базовый ArrayAdapter не будут работать для того, чтобы заставить работать флажки? - person DashRantic; 09.11.2011
comment
ArrayAdapter также может работать, проверьте этот пример vogella.de/articles/AndroidListView/article.html< /а> - person Paresh Mayani; 09.11.2011
comment
@PareshMayani, у вас есть идеи, как заставить это работать с выбором одного флажка? Я пробовал все, и это, кажется, не работает. Самое близкое, что я получил, - это вручную очистить все состояния выбора от пользовательских элементов, но это сработало только для строк над моим выбором, для работы ниже потребовался второй щелчок. - person Ionut Negru; 04.03.2014

Программно в java-коде

CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkBox);

mCheckBox.setChecked(true); //to check
mCheckBox.setChecked(false); //to uncheck

В андроиде XML

android:checked="true" //to check
android:checked="false" //to uncheck

as

<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="Checkbox Item" />
person MaxEcho    schedule 26.05.2014

Вы пробовали следующее?

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {

    //Invert the checkbox-status        
    ((CheckedTextView) view.findViewById(R.id.text1)).setChecked(!isChecked());

    return;

}   
person karllindmark    schedule 09.11.2011
comment
Элементы в списке являются динамическими — для каждого элемента строки нет уникального XML-идентификатора. Если я неправильно понял это? Но я все равно попробовал и получил исключение NullPointerException :( - person DashRantic; 09.11.2011
comment
В любом случае этого делать не нужно, можно checkbox.toggle() ;) - person Martin Marconcini; 11.09.2020

Вы можете использовать специальный базовый адаптер. Это позволит вам выбрать только один за раз, но вы можете изменить это, отменив проверку, чтобы увидеть, какие из них выбраны.

public class CheckBoxGridAdapter extends BaseAdapter{

    LayoutInflater inflater;
    ArrayList<Holder> list;
    int res;
    Context context;

    public CheckBoxGridAdapter(Context context, ArrayList<Holder> list, int layoutResourceId) {
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.list =list;
        this.res = layoutResourceId;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View convertView, ViewGroup parent) { 
        final ViewHolder holder; 
        if (convertView == null) { 
            convertView = inflater.inflate(res, 
                    parent, false);
            holder = new ViewHolder(); 
            holder.tv1 = (TextView) convertView.findViewById(R.id.checkBoxTxt); 
            holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); 
           convertView.setTag(holder); 
       } else { 
           holder = (ViewHolder) convertView.getTag(); 
       } 
       Holder h = list.get(position);
       holder.tv1.setText(h.getCBName());
       holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

           @Override
           public void onCheckedChanged(CompoundButton buttonView,
                   boolean isChecked) {
               if(isChecked)
               {
                    int pos = (Integer) buttonView.getTag();
                    checkChecks(pos);               
               }
               CheckBoxGridAdapter.this.notifyDataSetChanged();
           }
       });
       holder.cb.setTag(position);
       holder.cb.setChecked(list.get(position).getSelectState());
       return convertView; 
    }

    protected void checkChecks(int pos) {
            for(int i = 0;i<list.size();i++)
            {
                Holder h = (Holder) list.get(i);
                if(i==pos)
                {
                  Log.d( pos +" checked","is checked");
                  h.setSelectState(true);
                }
                else
                {
                     Log.d( i +" checked","is  not checked");
                     h.setSelectState(false);
                }
            }
    }

    static class ViewHolder
    {
        TextView tv1;
        CheckBox cb;
        RadioButton rb;
    }

}
person droid-zilla    schedule 02.07.2014

Вы можете переключить флажок, выполнив следующие действия:

checkbox.setChecked(!checkbox.isChecked());

Где checkbox — ваш элемент Checkbox.

person Zellius    schedule 30.01.2021