Несоответствие обнаружено. Неверный держатель представления (после обновления данных) - PullRequest
0 голосов
/ 20 октября 2019

Я использую RecyclerView с сообщениями, и когда пользователь щелкает элемент, он запускает новую функцию PostDetailActivity.

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

Проблема в том, что когда пользователь запускает PostDetailActivity, счетчик просмотров обновляется, но когда он возвращается к основному RecyclerView, у нас возникает фатальная ошибка, и приложение вылетает: обнаружено несоответствие. Неверный адаптер держателя вида PositionViewHolder

Я провел исследования, и эта ошибка произошла, когда люди добавили новые данные, но в моем случае я не добавляю новые данные, я просто обновляю поле из своей базы данных

Вот мой код для счетчика просмотров (в PostDetailActivity):

viewsCollection.document(current_user).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if(task.isSuccessful()) {
                    if (!task.getResult().exists()) {
                        Map<String, Object> viewMap = new HashMap<>();
                        viewMap.put("timestamp", FieldValue.serverTimestamp());

                        viewsCollection.document(current_user).set(viewMap);
                        postDocument.update("views", FieldValue.increment(1));
                    }
                }
            }
        })

Вот мой слушатель SnapShot для обновления пользовательского интерфейса (в PostDetailActivity):

 postDocument.addSnapshotListener(new EventListener<DocumentSnapshot>() {
            @Override
            public void onEvent(@androidx.annotation.Nullable DocumentSnapshot documentSnapshot, @androidx.annotation.Nullable FirebaseFirestoreException e) {
                if (documentSnapshot != null) {
                    if (documentSnapshot.getLong("views") != null) {
                        txtPostViews.setText((documentSnapshot.getLong("views").toString()));
                    }
                }
            }
        });

Вот мой код для заполнения RecyclerView (вMainActivity):

firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
                        @Override
                        public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                            if (e != null) {
                                Log.w("Error", "Listen failed.", e);
                                return;
                            }
                            if (queryDocumentSnapshots != null && !queryDocumentSnapshots.isEmpty()) {
                                lastVisible = queryDocumentSnapshots.getDocuments().get(queryDocumentSnapshots.size() - 1);
                                postList.clear();
                                for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
                                    if (doc.getType() == DocumentChange.Type.ADDED) {
                                        String postId = doc.getDocument().getId();
                                        Post post = doc.getDocument().toObject(Post.class).withId(postId);
                                        postList.add(post);
                                        mMainList.getRecycledViewPool().clear();
                                        forumRecyclerAdapter.notifyDataSetChanged();
                                    }
                                }
                            }
                        }
                    });

Вот код кнопки возврата (в PostDetailActivity):

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                break;
        }
        return true;
    }

Вот LogCat:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.XXX.XXX, PID: 19661
    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{1409fd7 position=10 id=-1, oldPos=-1, pLpos:-1 no parent} androidx.recyclerview.widget.RecyclerView{2f14a37 VFED..... ........ 0,0-1080,1669 #7f0a00ad app:id/main_list}, adapter:com.XXX.XXX.Adapters.ForumRecyclerAdapter@2e38ba4, layout:androidx.recyclerview.widget.LinearLayoutManager@4469d0d, context:com.XXX.XXX.Activities.MainActivity@e21878f
        at androidx.recyclerview.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5715)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5898)
        at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:286)
        at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:343)
        at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:359)
        at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:366)
        at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:397)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7058)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

Буду очень признателенза вашу помощь, потому что я провел много исследований, и я действительно не понимаю, почему мое приложение падает ...

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