Получение флажков в пользовательском ListView для правильной работы - PullRequest
0 голосов
/ 04 сентября 2011

у меня есть собственный макет строки для моего списка:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<CheckBox
android:id="@+id/chkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

Я использую этот макет для моего адаптера в упражнении:

adapter = new AdapterCustomBoxes(context, R.layout.custom_check_row, (ArrayList<Map<String, String>>) list_values);
list.setAdapter(adapter);    
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

И адаптер для этого, вот метод getView моего адаптера:

public class AdapterCustomBoxes extends ArrayAdapter<Map<String, String>> {

private List<Map<String, String>> list;
private List<Map<String, String>> orig_list;

private Context upper_context;
private View view;

public AdapterCustomBoxes(Context context, int textViewResourceId, ArrayList<Map<String, String>> items) {
    super(context, textViewResourceId, items);

    this.list = items;
    this.orig_list = items;
    this.upper_context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

view = convertView;

if (view == null) {
    LayoutInflater vi = (LayoutInflater)upper_context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = vi.inflate(R.layout.custom_check_row, null);
}

Map<String, String> selectedgroup = new HashMap<String, String>();
selectedgroup = (Map<String, String>) list.get(position);
String itemtext = (String) selectedgroup.get("item_text");

TextView row_text = (TextView) view.findViewById(R.id.text);

row_text.setText(itemtext);

return view;
}
}

А теперь наступает момент, когда я запутываюсь. Когда я проверяю один из этих флажков, проверяется выбранный. Но без какой-либо логики некоторые флажки другой строки также проверяются. И если я затем прокручиваю список, проверенное состояние каждого поля может изменяться от одного раза, когда я пересекаю эту строку, до следующего раза.

Так в чем здесь проблема?

Я уже пытался добавить onclicklistener к представлению в адаптере, а затем установить явный флажок в значение cheched / unchecked, когда этот слушатель запущен, но это также не работает, как я ожидал, я нажал на один блок и другой был проверен.

Итак, я думаю, что это проблема с переработанными представлениями? Должен ли я сохранять проверенное состояние отдельно и восстанавливать его каждый раз в методе getView, может ли это быть решением? Или есть более простой способ? Пожалуйста, помогите;)

Так кто-нибудь может дать мне подсказку? Большое спасибо!

--- РЕДАКТИРОВАТЬ ---

Итак, что я сейчас пытался сохранить в статусе флажков, так это создать карту:

private Map<View, Boolean> itm = new HashMap<View, Boolean>();

и сохраните состояние, когда в методе getView нажата кнопка:

CheckBox chkbox = (CheckBox) view.findViewById(R.id.chkbox);

    chkbox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            itm.put(buttonView, isChecked);
        }               
    });

    if(itm.containsKey(chkbox)){
        iteminfo_row_chkbox.setChecked( itm.get(chkbox) );
    }else{
        iteminfo_row_chkbox.setChecked(false);
    }

Извините, если это абсолютно неправильный подход, но разве это не должно работать? Результат тот же, что весь список и проверенные статусы неверны, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Хорошо, я думаю, что получил, я использовал статическое значение идентификатора из карты выбранной группы в качестве ключа в карте itm, чтобы найти отмеченный / непроверенный статус флажка. Использование представления было неправильным подходом, потому что их нельзя использовать в качестве ключа.

0 голосов
/ 04 сентября 2011

Несколько не по теме комментариев:

Сначала вам это не нужно:

Map<String, String> selectedgroup = new HashMap<String, String>();

Вы можете просто сделать это:

Map<String, String> selectedgroup = (Map<String, String>) list.get(position);

Также,Вы уверены, что вам нужен TextView?Флажок также может содержать текст.

О ваших проблемах, как сохранить, какой флажок отмечен?Вы должны установить флажок при возврате представления, особенно при повторном использовании представлений.

- Правка -

Почему бы вам не создать подобный закрытый класс?

private class ListItem{
    String text;
    boolean value;
}

И тогда вместо List<Map<String,String>> вы могли бы просто иметь List<ListItem>.

О onCheckedChangeListener, вы могли бы перебирать список, используя текст из флажка, чтобы найти правильную позицию изатем измените значение.Если текст не является уникальным, вместо использования onCheckedChangeListener, вы можете использовать в ListView a OnItemClickListener, который содержит позицию щелчка.

...