2012-06-03 4 views
1

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

это то, что я до сих пор:

 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, а иногда и случайные значения.

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

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

+0

Я думаю, что вы ищете является ExpandableListView , http://stackoverflow.com/questions/3483690/expandablelistview-sample-from-google –

ответ

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

Но как вы получаете идентификатор строки в функции слушателя? То там, где я ошибаюсь. – arnab321

+0

@ arnab321 Извините за задержку, этот комментарий проскользнул мимо меня. Я добавил обновление, если вы еще не решили это. – Sam

+0

Я не думаю, что это сработает, так как я также упомянул вопрос о дублировании флажков, отмеченных галочкой, так как андроид повторно использует представления. Если вы установите 'SetTag' только один флажок и немного прокрутите список, вы увидите больше флажков с тем же тегом. – arnab321

Смежные вопросы