Состояние флажка ListView Viewholder

У меня некоторые проблемы с моим адаптером ListView (и его недавно реализованным viewHolder). У меня есть ListView с флажком для каждого элемента (ничего нового здесь). Проблема в том, что, если в моем списке больше 9 элементов, когда я проверяю первый флажок, десятая будет автоматически проверена (такая же для второй с одиннадцатой), как если бы был один прослушиватель для обоих элементов (и я Быть верным, так или иначе).

Я прочитал вопрос о позиции с listView, просмотрите переработку и способ ViewHolder, чтобы решить эту проблему здесь: Как я могу сделать свой ArrayAdapter следующим за шаблоном ViewHolder?

Но я, вероятно, сделал что-то неправильно, потому что он не работает …

public class PresenceListAdapter extends SimpleAdapter { private LayoutInflater inflater; private List<Integer> ids; private List<String> statuts; public PresenceListAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to, List<Integer> ids, List<String> statuts) { super (context, data, resource, from, to); inflater = LayoutInflater.from (context); this.ids = ids; this.statuts= statuts; } @Override public Object getItem (int position) { return super.getItem (position); } @Override public View getView (int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate (R.layout.list_text_checkbox, null); holder = new ViewHolder(); holder.btn = (Button) convertView.findViewById(R.id.btnRetard); holder.check = (CheckBox) convertView.findViewById(R.id.checkPresent); if (statuts.get(position).equals("P")) { Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_online); holder.btn.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null ); holder.btn.setEnabled(true); holder.check.setChecked(true); } else if(statuts.get(position).equals("R")) { Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_away); holder.btn.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null ); holder.btn.setEnabled(true); holder.check.setChecked(true); } else { Drawable img = inflater.getContext().getResources().getDrawable(android.R.drawable.presence_invisible); holder.btn.setCompoundDrawablesWithIntrinsicBounds( img, null, null, null ); holder.check.setChecked(false); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } int id = ids.get(position); if(id != 0) { holder.check.setTag(id); holder.btn.setTag(id); } return super.getView (position, convertView, parent); } static class ViewHolder { Button btn; CheckBox check; } 

И мой слушатель: public void changerPresent (View v) {

  CheckBox checkPresent = (CheckBox) v; int idPersonne = (Integer) checkPresent.getTag(); View parent = (View)v.getParent(); Button btn = (Button) parent.findViewById(R.id.btnRetard); if(checkPresent.isChecked()) { gestion.updatePresence(idPersonne, idSeance, "P"); btn.setEnabled(true); setBtnRetardPresent(btn); } else { gestion.updatePresence(idPersonne, idSeance, "A"); btn.setEnabled(false); setBtnRetardAbsent(btn); } } 

Буду признателен за любую помощь на этом этапе, я работаю над этим часами.

Большое спасибо.

Вот как я сделал это:

Во-первых, вам нужен отдельный массив для вашего проверенного состояния. Он должен быть того же размера, что и getCount() вашего адаптера.

Затем в вашем getView ваш checkbox setOnCheckedChangedListener ДОЛЖЕН ПРЕКРАТИТЬ ваши checkbox.setПроверенные заявления.

пример:

 holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { isChecked[position] = isChecked; } }); holder.checkBox.setChecked(isChecked[position]); 

Вы должны установить состояние CheckedBox вне инициализации ViewHolder, например, следующий код:

 if (convertView == null) { viewHolder = new ViewHolder(); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.checkedBox.setChecked(); 

BTW: используйте SparseBooleanArray вместо двух списков для хранения состояния CheckedBox.

Проблема заключается в том, что listview перерабатывает его виды

Поэтому в getView( )

  if (convertView == null) { ........ } else { holder = (ViewHolder) convertView.getTag(); } // Uncheck needed boxes here... You need to implement your logic if( 'position' is checked earlier) holder.check.setChecked(true); else holder.check.setChecked(false); 

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

Intereting Posts
RoadManager для ошибки osmdroid View – поиск события, подобного on (View) Destroyed Ошибка поддержки Android SupportMapFragment Оператор == не может применяться к «Long» и «Int» в Kotlin Черный экран вместо мульти-текстурирования Легкий способ создания пользовательского интерфейса Android? Android Log.X не печатает stacktrace Как решить проблему «Нет активности для обработки Intent» Владелец устройства на нетронутом устройстве (Android L), без NFC, с использованием оболочки adb, dpm set-device-owner Что такое android: поддерживает Rtl = "true" в файле AndroidManifest xml Защелка (используется для ожидающего ответа на асинхронный режим) замораживает WebView (и пользовательский интерфейс) Нужна помощь с Android Emulator Networking Как проверить Admob в реальном устройстве, если без идентификатора рекламного блока Android AWS SDK версии 2.2.1 – gethttprequest лишен, не в состоянии найти замену Добавление gif-изображения в качестве значка загрузки Android?