更新和重新加载整个RecyclerView,而无需添加新单元

时间:2019-03-24 21:05:47

标签: java android android-recyclerview recycler-adapter

我需要重新加载/刷新recyclerView中的所有单元,并且如果发生数据更改,我需要更新单元而不是添加新单元。我将Firebase用于我的聊天应用程序。在主chatList中,每当收到新消息时,用户名就会重复,并将新消息添加为新单元格。无需执行此操作,我需要使用用户名下的最新消息在同一单元格中进行更新。

我需要一个等效于reloadData()的快速版本的代码,在该代码中整个视图都将刷新并重置。

mDatabase.child(jobID).child(UserID).child("Messages").orderByKey().limitToLast(1).addListenerForSingleValueEvent(new ValueEventListener() {

                                    @Override
                                    public void onDataChange(DataSnapshot snapshot) {



                                        for(DataSnapshot ds : snapshot.getChildren()) {
                                             String MessageBody = ds.child("MessageBody").getValue(String.class);
                                            mDataList.add(new message_Data(
                                                    jobID,
                                                    UserID,
                                                    UID,
                                                    name,
                                                    MessageBody,
                                                    company



                                            ));





                                        }

                                        mDataAdapter = new message_Adapter(thiscontext, mDataList);
                                        mRecyclerView.setAdapter(mDataAdapter);




                                    }

我尝试放置mDataList.clear();在for循环之前,但这只会给我发送消息的最后一个用户。

收到消息时的当前聊天屏幕

screenshot

2 个答案:

答案 0 :(得分:0)

使用adapter.notifyDataSetChange()或通过位置通知数据集更改是更新回收者视图适配器的方法

答案 1 :(得分:0)

如果要使用聊天应用程序,建议您使用OnChildListener方法 在OnCreate

上方创建
ChildEventListener ItemsListener = new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) 
    {

        if (dataSnapshot.exists())
        {
            DisplayItems(dataSnapshot);
        }

    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
    {

    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
};

然后在OnCreate中调用YourRef.addChildEventListener(ItemsListener);

在displayItem方法中,您将获得每个数据快照。 现在,简单地使用它即可(将其添加到巡回回收器视图中,并在每次添加项目时调用adapter.notifydatasetchanged())。 如果有人发送新消息,则仅对此新消息调用onchildadded 如果邮件被更改,删除,移动,也将被调用。