IndexOutOfBoundsException: обнаружено несоответствие. Неверная позиция элемента - RecylerView - PullRequest
0 голосов
/ 08 ноября 2018

IndexOutOfBoundsException: обнаружено несоответствие. Неверная позиция товара - RecylerView

У меня есть два вида рециркуляции, пусть будут RecylerA и RecylerB Пока RecyclerB находится на последней позиции, я загружаю оставшиеся данные и уведомляю адаптер RecyclerB. Он прекрасно работает для меня. Но при загрузке RecyclerB я пытаюсь щелкнуть RecyclerA, RecylerA фактически очищает адаптер RecylerB и загружает новые данные через API. Практически все время для меня это нормально работает. Но когда-нибудь я перехожу к следующей проблеме:

 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 24(offset:24).state:36 android.support.v7.widget.RecyclerView{620771f VFED..... ...
        at android.support.v7.widget.RecyclerView$Recycler.a(Unknown Source:389)
        at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(Unknown Source:14)
        at android.support.v7.widget.GapWorker.flushTaskWithDeadline(Unknown Source:15)
        at android.support.v7.widget.GapWorker.flushTasksWithDeadline(Unknown Source:22)
        at android.support.v7.widget.GapWorker.a(Unknown Source:3)
        at android.support.v7.widget.GapWorker.run(Unknown Source:71)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6626)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

Я пробую почти все решения, которые я вижу в StackOverflow, как

mRecyclerViewproduct.getRecycledViewPool().clear();
mRecyclerViewproduct.setItemAnimator(null);

перед уведомлением адаптера. Также добавлена ​​дополнительная задержка при уведомлении адаптера. Обновите уведомляющий адаптер, используя позицию и т. Д. Но у меня нет решения. Есть ли какая-нибудь новая идея или решение для этого?

Обновление: Адаптер для RecyclerA следующим образом (viewHolder)

if (selectedPosition == position) {
            holder.list_rv_productchip.setTextColor(Color.WHITE);
            holder.itemView.setBackground(context.getResources().getDrawable(R.drawable.chipselected));
        } else {
            holder.list_rv_productchip.setTextColor(Color.BLACK);
            holder.itemView.setBackground(context.getResources().getDrawable(R.drawable.quantityblack));
        }

        holder.itemView.setOnClickListener(view -> {
            selectedPosition = position;
            notifyDataSetChanged();
            ((CategorywiseProductlistActivity) context).loadingpageflag = true;
            ((CategorywiseProductlistActivity) context).filterdata = "{\"filter\":{ } }";
            constantsVariables.category_wise_product_paging=1;
            ((CategorywiseProductlistActivity) context).makeCategorycurrentidtochip(subCategories.get(position).getId());
            if (subCategories.get(position).getName().matches("All Items")) {
                ((CategorywiseProductlistActivity) context).titleallproducts.setText("All in " + ((CategorywiseProductlistActivity) context).headtitle);
            } else {
                ((CategorywiseProductlistActivity) context).titleallproducts.setText("All in " + subCategories.get(position).getName());
            }
            ((CategorywiseProductlistActivity) context).Categorycurrentid = "" + subCategories.get(position).getId();
            ((CategorywiseProductlistActivity) context).displayproducts(subCategories.get(position).getId(), "{\"filter\":{ } }");
        });
...