RecyclerView.Adapter ClassCastException при большой прокрутке - PullRequest
0 голосов
/ 20 января 2020

Я создаю приложение чата, в котором я использую RecyclerView с адаптером, и он использует разные держатели просмотра, потому что сервер отправляет Rich Content, для которого требуются различные графики представлений и т. Д. c.

Когда я Я обычно использую приложение и общаюсь с сервером, запрашивая другой контент, что означает, что у разных пользователей все отлично. Адаптер верхнего уровня преобразует основной видоискатель в тот, который мне нужен, каждый раз, когда я отправляю другой запрос.

После долгого чата и различных виджетов, генерируемых и надуваемых, при быстрой прокрутке RecyclerView вверх и вниз , основной адаптер выполняет рендеринг элементов, и он создаст sh с classcastException, в случаях, когда ранее во время чата он не создавал sh.

Вот пример:

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());

    //depending the type of rich content i get from the server i inflate the respective xml
    switch (MessageType.values()[viewType]) {
        case 1:
            View plainTextView = inflater....
            return new ViewHolder1(plainTextView);
        case 2:
            View secondView = inflater...
            return new ViewHolder2(secondView);
        case 3:
            View thirdView = inflater...
            return new ViewHolder3(verticalView);     
    }
   return null;
}

Затем в onBindViewHolder я разыграл ViewHolder в зависимости от случая onCreateViewHolder

    @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
                [...]
    case 2:

                    final ViewHolder2 holder = (ViewHolder2) holder;
                    //do stuff
                    break;

Ошибка

2020-01-20 13:22:57.322 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.----.app, PID: 28353
java.lang.ClassCastException: com.-----.ui.adapters.MainCarouselAdapter$CarouselViewHolder cannot be cast to com.----.ui.adapters.QuickRepliesAdapter$OptionsViewHolder
    at com.-----.ui.adapters.QuickRepliesAdapter.onBindViewHolder(QuickRepliesAdapter.java:22)
    at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
    at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
    at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)
    at androidx.recyclerview.widget.GapWorker.prefetchInnerRecyclerViewWithDeadline(GapWorker.java:335)
    at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:351)
    at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)
    at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)
    at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)
    at android.os.Handler.handleCallback(Handler.java:907)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:216)
    at android.app.ActivityThread.main(ActivityThread.java:7625)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

1 Ответ

0 голосов
/ 23 января 2020

Для тех, кто сталкивался с чем-то похожим, у меня был общий viewPool для моего основного и вспомогательного RecyclerViews.

Переработанные пулы представлений позволяют нескольким RecyclerViews совместно использовать общий пул представлений брака. Это может быть полезно, если у вас есть несколько RecyclerViews с адаптерами, которые используют одни и те же типы представлений, например, если у вас есть несколько наборов данных с одинаковыми видами представлений элементов, отображаемых ViewPager.

У меня нет тот же ViewTypes в моей инфляции, поэтому я обнаружил, что он должен был уйти.

При удалении ошибка перестала существовать. Кроме того, я исправил свое «наименование» в различных xml файлах, которые были раздуты в зависимости от вызываемого ViewHolder. Я использовал те же имена для некоторых распространенных TextViews et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...