Просмотр списка Android с проблемой флажка - PullRequest
25 голосов
/ 26 марта 2011

У меня странная проблема!Я пытаюсь создать просмотр списка с флажками.В моем другом потоке мне сказали, что я должен использовать массив, который отслеживает проверенные строки.Я сделал это, и все работало нормально, но логика неверна, и я столкнулся с другой проблемой.

public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }

        CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox);
        checkbox.setChecked(checked[position]);

        final LinearLayout rowLayout = (LinearLayout) v.findViewById(R.id.individualRow);

        checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    rowLayout.setBackgroundColor(Color.GRAY);                       
                    checked[position] = false;                      
                }
                else
                {   
                    rowLayout.setBackgroundColor(Color.DKGRAY);
                    checked[position] = true;                       
                }
            }               
        });
   }

Если все флажки сняты изначально, все работает нормально, оставляя те, которые я выбрал, проверенными, даже еслиЯ прокручиваю вниз и снова вверх, но проверенный массив не настроен должным образом.По сути, тест if должен быть другим способом!

if(isChecked)
{
   rowLayout.setBackgroundColor(Color.GRAY);                        
   checked[position] = true;                        
}
else
{   
   rowLayout.setBackgroundColor(Color.DKGRAY);
   checked[position] = false;                       
}

Проблема действительно заключается в прокрутке, потому что каждый раз, когда я прокручиваю, вызывается метод onCheckedChanged и, поскольку он перерабатывает строки, он проходит в позицииновая строка, которая не выбрана, но так как у нее тот же индекс, что и у ранее выбранной, она меняет свое значение.например, если я установлю флажок с индексом 2 (установите для него значение true), а затем прокрутите вниз, то новая строка станет строкой с индексом 2, метод вызывается снова и снимает флажок (поле в проверенном массиве).

Мне нужно, чтобы он "запомнил" все флажки, которые отмечены.Другими словами, я хочу, чтобы проверенный массив был правильно инициализирован.А также помнить, какие флажки отмечены, и не терять их при каждой прокрутке!

Что я делаю не так?

Не могли бы вы мне помочь?

Заранее спасибо -- Майк

Ответы [ 2 ]

75 голосов
/ 27 марта 2011

Это было сложно.

Проблема в том, что вы звоните setChecked, активируя старый OnCheckedChangeListener.

Исправление довольно простое: позвоните setOnCheckedChangeListener перед вызовом setChecked. Таким образом вы прервете связь со старым слушателем из переработанного представления.

0 голосов
/ 10 сентября 2015

Установите этот флажок для Однократного выбора Checkbox в Listview

AdpList adapter=new AdpList(this,array,false);
listview.setAdapter(adapter);

Когда вы выбираете любой элемент, затем на элементе CLickListener выполните следующие действия

listview.setonItemClickListener(new OnItemClickListener)

Здесьполучит позицию текущего элемента

array.get(Position);

Получите представление «Флажок» и, нажав на флажок, создайте метод в адаптере, например

adapter.setList(true);
adapter.notifyDataSetChanged();

И в адаптере проверьте параметр, которыйЯ прошел метод Setlist и поставил условие:

if (isChecking==true)
{
checkbox1.setChecked(true);
}else{
checkBox1.setChecked(false);
}
...