Флажки в списке просмотра Android имеют проблемы - PullRequest
2 голосов
/ 10 января 2011

У меня есть список с пользовательским BaseAdapter, и каждая строка содержит флажок и три текстовых просмотра.Я использую Layoutinflater, чтобы надуть эту строку из XML-файла.Однако каждый раз, когда я отмечаю один флажок, многие другие флажки отмечаются во всем списке, тогда как исходный флажок, который я хотел проверить, иногда проверяется сам, а иногда нет.

Каждый раз, когда пользователь выбирает флажок, я сохраняю уникальное значение этого флажка в коллекции.В следующий раз, когда вызывается метод getView, я вручную проверяю / снимаю флажок перед возвратом представления внутри getView (), основываясь на том, было ли значение флажка уже в коллекции или нет.Но, несмотря на это, он по-прежнему помечает эти флажки, даже если checkchangelistener для этих флажков не запускается.Я сомневаюсь, что из-за повторного использования представлений в getView, но я не знаю, как можно заставить все это работать.

Ответы [ 3 ]

6 голосов
/ 12 ноября 2011

Избегайте if (convertView == null) и всего остального. Это точно подойдет вам.Спасибо.

3 голосов
/ 10 января 2011

проблема определенно в вашем методе getView ();

Попробуйте что-то вроде этого

public View getView(int position, View convertView, ViewGroup parent) {
        View vu = convertView;
        ViewHolder vHolder = null;
        try {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            if (vu == null) {
                vu = (View) inflater.inflate(R.layout.list_fr_req, null);
                vHolder = new ViewHolder();
                vHolder.checkbox = (CheckBox) vu.findViewById(R.id.my_ChkBox);
                vu.setTag(vHolder);
            } else {
                vHolder = (ViewHolder) vu.getTag();
            }
            vHolder.checkbox.setOnCheckedChangeListener(this);

            vHolder.checkbox.setId(position);
            vHolder.textView.setId(position);

            if (myList.get(position).getCheckedStatus())
                vHolder.checkbox.setChecked(true);
            else
                vHolder.checkbox.setChecked(false);

        } catch (Exception e) {
            Log.d("Exception in getview", e + "");
            e.printStackTrace();
        }
        return vu;
    }

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            list.get(buttonView.getId()).setCheckedStatus(true);
        } else {
            list.get(buttonView.getId()).setCheckedStatus(false);
        }
    }

    public static class ViewHolder {
        CheckBox checkbox;
        TextView textview;
    }

С уважением: N_JOY.

0 голосов
/ 04 июля 2017

Используйте OnClickListener вместо OnCheckedChangeListener. Последнее срабатывает даже при обновлении переработанного представления, чтобы оно соответствовало значению объекта. В следующем фрагменте кода getView () я использую HashMap для хранения контрольного значения объектов (itemMap).

            boolean checked=itemMap.get(currentObject);
            if(checked!=checkBox.isChecked())
                checkBox.setChecked(checked);
            checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox checkBox1=(CheckBox)v;
                    if(checkBox1.isChecked()) //ckecked
                    {
                        itemMap.put(currentObject,true);
                        if(checkListener!=null)
                            checkListener.onCheck(position,convertView,parent,adapter);
                    }
                    else{ //unchecked
                        itemMap.put(currentObject,false);
                        if(checkListener!=null)
                            checkListener.onUnCheck(position,convertView,parent,adapter);
                    }
                }
            });

checkListener - это дополнительный слушатель, который может быть добавлен пользователем класса.

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