Как я могу остановить мой RecyclerView, заполненный из базы данных Firebase и управляемый FirebaseRecyclerAdapter, от воссоздания удаленных представлений? - PullRequest
2 голосов
/ 29 апреля 2020

Контекст проблемы:

1) У меня проблемы с приложением-клоном в социальных сетях, в частности с фидом пользователей (в программе recyclerView) и манипулированием сообщениями (в классе ViewHolder).

2) Представления заполняются из базы данных Firebase Realtime.

3) Создание «поста» работает правильно (вся информация правильно передается в Firebase и загружается в переработчик).

4) Я могу удалить сообщение из Firebase, используя:

firebaseRecyclerAdapter.getRef(postsViewHolder.getAdapterPosition()).removeValue();

Однако, если я создаю новое сообщение после удаления предыдущего сообщения, ранее удаленное сообщение снова появляется как в базе данных, так и в программе утилизации.

Наблюдения за проблемами:

1) Похоже, что локальная копия сообщения хранится в массиве (я не создавал массив, поэтому должен быть какой-то массив по умолчанию, инициируемый снимком данных или чем-то еще ).

2) Если я смогу каким-то образом сбросить индекс этого скрытого массива, я думаю, что проблема будет решена. Для каждого сеанса приложения определено, что recyclerView заполняет столько сообщений, сколько было в текущем сеансе. Чтобы уточнить, я могу создать сообщение, перезагрузить сеанс, удалить его, создать другое сообщение, и удаленное сообщение не появится снова.

Попытки проблемы:

Я пытался использовать

1) newsFeedRecycler.getRecycledViewPool().clear();
2) firebaseRecyclerAdapter.notifyItemRangeRemoved(0,firebaseRecyclerAdapter.getItemCount());
3) postsViewHolder.itemView.destroyDrawingCache();
4) newsFeedRecycler.setAdapter(firebaseRecyclerAdapter);
5) firebaseRecyclerAdapter.notifyDataSetChanged();
6) firebaseRecyclerAdapter.notifyItemRemoved(postsViewHolder.getAdapterPosition());

и более в течение 3 дней, чтобы попытаться эффективно стереть удаленный пост из локальной памяти, а также из Firebase.

Проблема Обращение:

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

1 Ответ

0 голосов
/ 29 апреля 2020

Для будущих зрителей я смог решить свою проблему, добавив, казалось бы, мелкие детали (то, что я вспомнил, увидев в другом ответе, но рассматривая другую проблему). Изначально мой метод загрузки сообщения выглядел примерно так:

private void uploadPostInfo() {

    userReference.child(currentUserID).addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){

                HashMap postsMap = new HashMap();

                postsMap.put("timestamp", formattedDate);
                postsMap.put("uid",currentUserID);
                postsMap.put("postText",postText);
                postsMap.put("postImage",downloadUrlImage);
                postsMap.put("postFile",downloadUrlFile);

                postsReference.child(currentUserID + formattedDate).updateChildren(postsMap)

            }

Это, безусловно, выглядит правильно. Однако использование «addValueEventListener» добавляет все кэшированные значения сообщения. Правильный способ исправить эту проблему - ограничить прослушиватель одним событием - использование addSingleValueEventListener(new ValueEventListener() { вместо addValueEventListener(new ValueEventListener() {.

Также для будущих зрителей - еще одна проблема, ранее влияющая на согласованность моего приложения при управлении сообщениями. (и из-за этого проблема выглядела более сложной, чем была) в том, что мой пост "ключ" использовал getRef (), приняв параметр "position" OnBindViewholder () непосредственно из внутреннего вызова onClick () как часть "user" Корм "Активность. Например:

OnBindViewHolder: protected void onBindViewHolder(@NonNull final PostsViewHolder postsViewHolder, final int position, @NonNull final Posts model) {

Получение ключа до: PostKey = getRef(position).getKey();

Получение ключа после: PostKey = getRef(postsViewHolder.getAdapterPosition()).getKey();

Насколько я понимаю, это необходимо, потому что position может принимать новое значение только после повторного связывания, если position используется непосредственно для определения значения почтового ключа, однако (postsViewHolder.getAdapterPosition() может получить позицию без повторного связывания.

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