Снимите все флажки в пользовательском ListView - PullRequest
6 голосов
/ 15 марта 2011

Я пытаюсь сделать кнопку «Отменить выбор всех» в ListActivity, чтобы снять все флажки в ListView, управляемом пользовательским SimpleCursorAdapter.

Как и предполагалось здесь , я пытался

В моем ListActivity у меня есть:

Button bt_f_unsel = (Button) findViewById(R.id.btn_f_unsel);
bt_f_unsel.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {           
        for ( int i=0; i< getListAdapter().getCount(); i++ ) {
            mListView.setItemChecked(i, false);
        }
    }         
});        

но ничего не происходит.

Мне интересно, если это из-за моего пользовательского ряда:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/contact_pic"
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <TextView
        android:id="@+id/contact_name"        
        android:textSize="10sp"
        android:singleLine="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <CheckBox
        android:id="@+id/checkbox"
        android:button="@drawable/whipem_cb"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

, что делает mListView.setItemChecked () не найти флажок.

Как я могу снять все cb и обновить все строки с помощью кнопки в моей ListActivity?

Спасибо

Ответы [ 4 ]

4 голосов
/ 15 марта 2011

Честно говоря, я не думаю, что методы setChecked будут работать с пользовательским макетом.Ожидается, что представление будет CheckedTextView с идентификатором text1.

И поскольку представления перерабатываются, я думаю, что решение состоит в том, чтобы обновить все логические значения в ваших объектах в списке, которые определяют, установлен ли флажок, и затем вызвать adapter.notifyDataSetChanged().Вы изменяете логическое состояние данных (что действительно имеет значение) и говорите адаптеру обновить ListView.Поэтому в следующий раз, когда будут отображаться виды, флажок будет установлен правильно.А отображаемые текущие представления будут перерисованы.

3 голосов
/ 01 марта 2016

Это сработало для меня:

    MenuViewAdapter adapter = new MenuViewAdapter(this, menuViews,this);
ListView lv = (ListView)this.findViewById(R.id.menu_list);


CheckBox cb;

for(int i=0; i<lv.getChildCount();i++)
{
    cb = (CheckBox)lv.getChildAt(i).findViewById(R.id.checkBox);
    cb.setChecked(false);
}
adapter.notifyDataSetChanged();
3 голосов
/ 10 февраля 2013

Я использую грязный, но простой трюк:

//recursive blind checks removal for everything inside a View
private void removeAllChecks(ViewGroup vg) {
    View v = null;
    for(int i = 0; i < vg.getChildCount(); i++){
        try {
            v = vg.getChildAt(i);
            ((CheckBox)v).setChecked(false);
        }
        catch(Exception e1){ //if not checkBox, null View, etc
            try {
                removeAllChecks((ViewGroup)v);
            }
            catch(Exception e2){ //v is not a view group
                continue;
            }
        }
    }

}

Передайте ему свой список объектов. Просто избегайте действительно длинных и сложных списков.

0 голосов
/ 22 августа 2013

Я использую

checkbox.setChecked(false);
checkbox.refreshDrawableState();
...