Я использую 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)
Буду очень признателенза вашу помощь, потому что я провел много исследований, и я действительно не понимаю, почему мое приложение падает ...