我需要重新加载/刷新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循环之前,但这只会给我发送消息的最后一个用户。
收到消息时的当前聊天屏幕
答案 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 如果邮件被更改,删除,移动,也将被调用。