Итак, я создаю трекер привычек, который добавляет значение каждый раз, когда вы устанавливаете флажок в viewHolder, проблема, с которой я сталкиваюсь, заключается в том, что, когда у меня есть 6 или более привычек в списке, флажки не работают должным образом (они начинают проверять случайным образом order) больше и укажите ошибку выше.
Я использую это на своем адаптере ресайклера:
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position){
holder.nombre.setText(mHabitosList.get(position).getNombre());
FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mDatabase.getReference("Habitos");
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
userId = user.getUid();
habitosReference = mDatabaseReference.child(userId);
habitosReference.child(mHabitosList.get(holder.getAdapterPosition()).getHabitosId()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Habitos habitos = dataSnapshot.getValue(Habitos.class);
if (habitos != null) {
updateHabitosTotal[position] = habitos.getTotal();
checkBox1 = habitos.isCheckbox1();
checkBox2 = habitos.isCheckbox2();
checkBox3 = habitos.isCheckbox3();
checkBox4 = habitos.isCheckbox4();
checkBox5 = habitos.isCheckbox5();
checkListeners(holder, position);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
На чек-слушателе у меня есть
private void checkListeners(@NonNull final MyViewHolder holder) {
holder.CB1.setChecked(checkBox1);
holder.CB1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
{
if (holder.getAdapterPosition() != RecyclerView.NO_POSITION) {
String HabitosId = mHabitosList.get(holder.getAdapterPosition()).getHabitosId();
int total = mHabitosList.get(holder.getAdapterPosition()).getTotal();
if (b) {
habitosReference.child(HabitosId).child("Checks").child(mDays[0]).setValue(true);
total++;
} else {
habitosReference.child(HabitosId).child("Checks").child(mDays[0]).setValue(false);
total--;
}
habitosReference.child(HabitosId).child("total").setValue(total);
}
}
}
});
}
.... And the same for CB2,CB3,CB4,CB5..
Приношу свои извинения за дамп кода ... Любая помощь будет принята с благодарностью! (:
Ошибка кода:
E/UncaughtException: java.lang.ArrayIndexOutOfBoundsException: length=20; index=-1 at com.albot.focus.Adapters.HabitosAdapter$5.onCheckedChanged(HabitosAdapter.java:224)
В updateHabitosTotal [holder.getAdapterPosition ()] + = 1; в CheckListener (); Следует упомянуть, что я создал приватный int [] updateHabitosTotal = new int [20]; в начале Адаптера ..
Прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs для получения советов по отладке вашего приложения.




Поскольку вы не даете много кода или ошибки, я просто сделаю обоснованное предположение.
Вероятно, ваша проблема связана с переменной позиции, вам нужно указать свою позицию. mHabitList имеет индекс 0, он начинается с 0. Я предполагаю, что позиции нет, попробуйте вычесть 1 из позиции.
В остальном адаптер все как обычно .. Но это не так: /
Хорошо, можешь опубликовать ошибку + распечатку позиции и mHabitosList
При установке флажка отмечаются другие флажки, когда держателей более 6; если их 5 или меньше, все работает нормально
В документации уже упоминалось, что getAdapterPosition() может возвращать -1 или RecyclerView.NO_POSITION, если
RecyclerView.Adapter.notifyDataSetChanged() был вызван после
последний проход макета.ViewHolder уже утилизирован.поэтому, чтобы этого избежать, вы всегда должны проверять getAdapterPosition() != RecyclerView.NO_POSITION при нажатии на элемент
Ошибка происходит до -1, поэтому -1 является следствием ошибки, а не причиной.
в своем комментарии вы сами сказали, что ошибка возникает в updateHabitosTotal [holder.getAdapterPosition ()] + = 1, я вижу там вызов getAdapterPosition ()
Вы можете указать строку, где возникает ошибка?