у меня есть собственный макет строки для моего списка:
<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);
}
Извините, если это абсолютно неправильный подход, но разве это не должно работать? Результат тот же, что весь список и проверенные статусы неверны, что я делаю не так?