Множественный выбор ListView с пользовательским макетом

1

Я пытаюсь сделать gmail-like listview. То есть, изначально listview находится в режиме одиночного выбора, но при выборе checkbok он становится многократным.

это то, что у меня есть до сих пор:

     SimpleCursorAdapter dataSource = new SimpleCursorAdapter(this, R.layout.listitem, cursor,
             new String[]{"_id","a","b","c","d","e","f","g","h"}, 
             new int[] { R.id.checkBox1, R.id.a, R.id.b, R.id.c, R.id.d, R.id.e}
// all of these are a part of my list item custom layout.
             );

    dataSource.setViewBinder(new SimpleCursorAdapter.ViewBinder() {

@Override
public boolean setViewValue(View aView, final Cursor c, int i) {

    String s=c.getString(i);
    String toset="";
    TextView tv = i==0?null: (TextView) aView;
    if (i==0){
        if(chkL==null){
            chkL=new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton cb1, boolean isChecked) {
                    CheckBox cb=(CheckBox) cb1;
                    chkid[c.getPosition()]=isChecked;

                    if(lv.getChoiceMode()!=lv.CHOICE_MODE_MULTIPLE){
                        lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
                    }
                    lv.setItemChecked(c.getPosition()+1,isChecked);
                    log(isChecked+" selected "+(c.getPosition()+1));
                }

        };
        }

        CheckBox cb= (CheckBox) aView;
        cb.setOnCheckedChangeListener(chkL);

        return (i==0);
    }};

В настоящее время я пытаюсь хотя бы сделать элемент "выбранным", нажав на него флажок. Я использую c.getPosition()+1 (позиция курсора), чтобы получить позицию элемента списка. но это всегда возвращает 1 или иногда случайные значения.

update: похоже, что он всегда возвращает 1, но когда я повторяю getCheckedItemPositions(), я вижу, что элемент нет. 10 выбран. Нажмите еще один флажок, снова позиция курсора будет 1, но элемент № 11 будет выбран и так далее. Но если я выхожу за пределы флажка, выбирается правильный элемент.

Кроме того, при выборе одного флажка, если вы прокрутите вниз, вы увидите, что проверено несколько других флажков. (У меня около 255 элементов в списке). Я думаю, что это связано с тем, что андроид повторно использовал те же флажки?

Теги:
android-listview

1 ответ

0

Я бы попробовал несколько иной подход:

  • Держите ListView как SINGLE_CHOICE, но установите каждую строку CheckBox с помощью прослушивателя, который добавляет/удаляет id строки в список с именем checkedRows (например).

  • Если вы хотите удалить, переместить, звездочку и т.д. Проверенные строки: выполнить итерацию с помощью checkedRows и выполнить необходимые действия.

Я считаю, что это проще, чем изменение переключения между несколькими типами состояний и функциональных возможностей по умолчанию.

прибавление

Я никогда не переопределял setViewValue(), но это должно работать:

CheckBox cb= (CheckBox) aView;
cb.setOnCheckedChangeListener(chkL);
cb.setTag(c.getLong(c.getColumnIndex("_id"))); // Add this

и в вашем onClickListener():

long id = (Long) cb1.getTag();
  • 0
    Но как получить идентификатор строки в функции слушателя? Вот где я иду не так.
  • 0
    @ arnab321 Извините за задержку, этот комментарий ускользнул от меня. Я добавил обновление, если вы еще не решили это.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню