Выбрать все элементы ListView (пользовательская строка с флажком в нем) - PullRequest
14 голосов
/ 09 февраля 2011

Что у меня есть: У меня есть ListView с пользовательскими строками, с CheckBox и двумя TextViews в каждой строке.У меня есть кнопка «Выбрать все».

Что я хочу: Я хочу, чтобы, когда я нажимал кнопку, все флажки в ListView проверялись / не проверялись.

В чем проблема: В OnClick кнопки «Выбрать все».я делаю это:

public void OnClickSelectAllButton(View view)
{
    ListView l = getListView();
    int count = l.getCount();
    for(int i=0; i<count; ++i) 
    {
       ViewGroup row = (ViewGroup)l.getChildAt(i);
       CheckBox check = (CheckBox) row.findViewById(R.id.checkBoxID);
       check.setChecked(true); // true for select all and false for unselect all etc..
    }
}

Здесь l.getChildAt (i) дает мне только видимые предметы.И когда индекс выходит из видимых элементов, возникает проблема.Я хочу проверить все флажки в списке, а не только видимые.

Ответы [ 3 ]

21 голосов
/ 09 февраля 2011

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

Введите переменную в вашей деятельности, которая будет содержать текущее состояние (boolean checkAll). Когда пользователь нажимает кнопку, он должен установить для «checkAll» значение true и вызвать notifyDataSetChanged() (для arrayadapter) или requery() (для cursoradapter) на адаптере ListView. В методе getView() адаптера введите проверку для этого флага, поэтому if (checkAll) {check the check box}

3 голосов
/ 09 февраля 2011
0 голосов
/ 19 декабря 2014

Я думаю, вы должны запустить эту долгосрочную задачу из потока пользовательского интерфейса. При нажатии кнопки в OnClickListener:

new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < list.getAdapter().getCount(); i++) {
                                final int position = i;
                                mHandler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        list.setItemChecked(pos, true);  
                                    }
                                });
                            }
                        }
                    }).start();     

и в onCreate ():

this.mHandler = new Handler();

Каждый элемент в виде списка должен быть Checkable, как CheckableRelativeLayout, который реализует интерфейс Checkable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...