Android listview с проблемой флажка

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

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 должен быть другим способом arround!

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

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

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

Что я делаю неправильно?

Можете ли вы мне помочь?

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

Ответ 1

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

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

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

Ответ 2

Проверьте это для одиночного выбора Checkbox в Listview

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

Когда вы выберете какой-либо элемент, затем на элементе CLickListener сделайте как следует

listview.setonItemClickListener(new OnItemClickListener)

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

array.get(Position);

Получите представление Checkbox и нажав флажок, создайте метод в Adapter, Like

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

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

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