E / UncaughtException: java.lang.ArrayIndexOutOfBoundsException: length = 100; индекс = -1

Итак, я создаю трекер привычек, который добавляет значение каждый раз, когда вы устанавливаете флажок в 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)

Вы можете указать строку, где возникает ошибка?

Susmit Agrawal 17.07.2018 21:33

В updateHabitosTotal [holder.getAdapterPosition ()] + = 1; в CheckListener (); Следует упомянуть, что я создал приватный int [] updateHabitosTotal = new int [20]; в начале Адаптера ..

Alfonso Briceño 17.07.2018 21:41
javacodegeeks.com/2013/09/…
Dave S 17.07.2018 21:50

Прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs для получения советов по отладке вашего приложения.

Code-Apprentice 17.07.2018 23:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
96
2

Ответы 2

Поскольку вы не даете много кода или ошибки, я просто сделаю обоснованное предположение.

Вероятно, ваша проблема связана с переменной позиции, вам нужно указать свою позицию. mHabitList имеет индекс 0, он начинается с 0. Я предполагаю, что позиции нет, попробуйте вычесть 1 из позиции.

В остальном адаптер все как обычно .. Но это не так: /

Alfonso Briceño 17.07.2018 21:46

Хорошо, можешь опубликовать ошибку + распечатку позиции и mHabitosList

Big_Bad_E 17.07.2018 21:49

При установке флажка отмечаются другие флажки, когда держателей более 6; если их 5 или меньше, все работает нормально

Alfonso Briceño 17.07.2018 22:04

В документации уже упоминалось, что getAdapterPosition() может возвращать -1 или RecyclerView.NO_POSITION, если

  1. Товар был удален из адаптера.
  2. RecyclerView.Adapter.notifyDataSetChanged() был вызван после последний проход макета.
  3. ViewHolder уже утилизирован.

поэтому, чтобы этого избежать, вы всегда должны проверять getAdapterPosition() != RecyclerView.NO_POSITION при нажатии на элемент

Ошибка происходит до -1, поэтому -1 является следствием ошибки, а не причиной.

Alfonso Briceño 17.07.2018 23:00

в своем комментарии вы сами сказали, что ошибка возникает в updateHabitosTotal [holder.getAdapterPosition ()] + = 1, я вижу там вызов getAdapterPosition ()

JAAD 17.07.2018 23:01

Другие вопросы по теме