在FireData数据库onDataChange上更新RecyclerView

时间:2018-02-27 10:11:27

标签: android firebase firebase-realtime-database android-recyclerview

我是recyclerView的新手。我正在创建一个应用程序,当我将数据发送到firebase数据库时,带有recyclerView中我的数据的复选标记的图像视图表明我的数据已到达数据库。

我是通过创建一个子键来实现的,该子键将数据从处理设置为在数据到达服务器时达到的值。

我还创建了一个imageView,如果已到达消息,则将其资源设置为复选标记。 直到现在它工作正常。但问题是我的recyclerView在同一时刻没有刷新。

如果我按下后退按钮(甚至关闭活动),然后返回相同的活动,图像视图就在那里。 因此,您可以理解我到目前为止完成的任务工作正常。 我甚至知道通过向我的recyclerView添加监听器可以解决这个问题。

FirebaseDatabase.getInstance().getReference().child("message").push().setValue(newMessage, new DatabaseReference.CompletionListener() {
  @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
      databaseReference.child("reachedServer").setValue("reached");
    }
});

但是我已经尝试过所有事情来更新我的recyclerView以改变孩子。

但只是它不起作用。当firebase中的孩子发生变化时,我现在已经删除了我的命令。 请帮助我,以便在孩子改变时刷新我的recyclerView

PS 即可。我将数据存储在自定义类中,并且还使用自定义适配器。

5 个答案:

答案 0 :(得分:2)

要刷新适配器,您可以使用:

adapter.notifyDataSetChanged();
  

notifyDataSetChanged

     

void notifyDataSetChanged()

     

通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。

此处有更多信息:https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

答案 1 :(得分:0)

是的,我做到了。
我在我的数据库引用的childEventListener的OnChildChanged方法中做了这个。

                @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot.getValue() != null) {
                    Message newMessage = dataSnapshot.getValue(Message.class);
                    if (newMessage != null) {
                        for (int i = 0; i < myArrayList().size(); i++) {
                            if (myArrayList().get(i).timestamp == newMessage.timestamp) {
                                myArrayList().remove(i);
                                myArrayList().add(i, newMessage);
                                break;
                            }
                        }
                    }
                    adapter.notifyDataSetChanged();
                }
            }

答案 2 :(得分:0)

尝试

  adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);

            recycler_view.setAdapter(adapter);
            adapter.notifyDataSetChanged();

        }
    });

答案 3 :(得分:-1)

在插入数据时会触发CompletionListener,这意味着您不需要对数据库进行任何其他更改,以便在客户端设备上显示某些内容(正在进行更改的内容)。< / p>

简单地说:在CompletionListener内更新特定的recycleView记录。您可以使用notifyItemChanged(position)notifyItemChanged(position, payload)执行此操作, 考虑第一次调用,您必须更改适配器中onBindViewHolder内使用的数据记录,或者您可以为onBindViewHolder中将使用的适配器设置一个标志。第二次通话使您可以传递任何其他数据。

请注意,notifyItemChanged(position, payload)来电是第一位且内部有notifyItemChanged(position)来电。您还需要其他信息吗?

答案 4 :(得分:-1)

要仅为更改的项目刷新适配器,请在onChildChaged()方法上使用以下代码:

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        Message message = dataSnapshot.getValue(Message.class);
        
        for (int i = 0; i < messagesList.size(); i++) {
            if (messagesList.get(i).getMessageID().equals(message.getMessageID())) {
                messagesList.set(i, message);
                adapter.notifyItemChanged(i);
                break;
            }
        }
}

请确保您的消息模型类中的每个消息及其获取器都有唯一的消息ID,在上面的示例中,这被称为MessageID和获取器getMessageID()。