java - 这是从 android 的 Firebase 数据库中以小块加载数据的正确方法吗?
问题描述
这是我第一次在这里发帖,如果我做错了事,请纠正我。
我正在尝试通过使用 Firebase 数据库创建一个简单的聊天应用程序来学习 Android 开发。现在我被困在加载更小块聊天数据的正确实现上。这是我到目前为止所做的。
存储库
public MutableLiveData<ArrayList<Chats>> loadPrivateChats(String withUid) {
roomId = generateUniqueRoomId(myId, withUid);
privateChatQuery =
firebaseDatabase.getReference().child(Constants.PRIVATE_CHAT_NODE)
.child(roomId).orderByChild("timeStamp").limitToLast(limit);
listenerPrivateChatQuery = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull @NotNull DataSnapshot snapshot,
@Nullable @org.jetbrains.annotations.Nullable
String previousChildName) {
Chats mCurrentChats = snapshot.getValue(Chats.class);
privateChatsArrayList.add(mCurrentChats);
privateChatsLiveData.setValue(privateChatsArrayList);
loadMore.setValue(true);
}
....
privateChatQuery.addChildEventListener(listenerPrivateChatQuery);
return privateChatsLiveData;
}
public void loadOldChats(){
privateChatsArrayList.clear();
limit = limit+3;
loadMore.setValue(false);
}
视图模型
public MutableLiveData<ArrayList<Chats>> loadPrivateChats(String withUid) {
MediatorLiveData<ArrayList<Chats>> chatsMediatorLiveData = new MediatorLiveData<>();
LiveData<Boolean> loadMore = chatRepository.loadMore;
chatsMediatorLiveData.addSource(chatRepository.loadPrivateChats(withUid), new Observer<ArrayList<Chats>>() {
@Override
public void onChanged(ArrayList<Chats> chats) {
chatsMediatorLiveData.setValue(chats);
}
});
chatsMediatorLiveData.addSource(loadMore, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if (!aBoolean) {
chatsArrayList.clear();
chatsArrayList = chatRepository.loadPrivateChats(withUid).getValue();
chatsMediatorLiveData.setValue(chatsArrayList);
}
}
});
return chatsMediatorLiveData;
}
public void loadMoreChats() {
chatRepository.loadOldChats();
}
分段
chatViewModel.loadPrivateChats(withUid).observe(getViewLifecycleOwner(),
new Observer<ArrayList<Chats>>() {
@Override
public void onChanged(ArrayList<Chats> chats) {
if (chats != null) {
privateChatAdapter.submitList(new ArrayList<>(chats));
int pos = chats.size() -1;
binding.recyclerViewPublicChat.smoothScrollToPosition(pos);
}
}
});
private void loadMoreChats() {
chatViewModel.loadMoreChats();
binding.swipeRefreshLayout.setRefreshing(false);
}
现在我的问题是,每当将消息发送到另一台设备时,都会间歇性地出现一些行为(重复消息,消息以随机顺序显示)。我的 recyclerview 使用 List 适配器
private static final DiffUtil.ItemCallback<Chats> DIFF_CALLBACK = new DiffUtil.ItemCallback<Chats>() {
@Override
public boolean areItemsTheSame(@NonNull Chats oldItem, @NonNull Chats newItem) {
return oldItem.timeStamp.equals(newItem.timeStamp);
}
@Override
public boolean areContentsTheSame(@NonNull Chats oldItem, @NonNull Chats newItem) {
return oldItem.message.equals(newItem.message) && oldItem.senderID.equals(newItem.senderID);
}
我将非常感谢有关以较小块加载数据的正确方法的任何线索。
谢谢
解决方案
推荐阅读
- asp.net-mvc - 如何在 MVC 中访问存储过程的结果
- delphi - Delphi中删除控件的默认命名
- java - JavaFX 8 | TextField 只允许数字和小数
- python-3.x - 解析xml时如何在python中获取从根到特定元素的xpath
- sql - SQLite - 具有多个连接的复杂 SELECT
- angularjs - 使用新数据问题重绘数据表
- javascript - 显示日期是一个 md-datepicker 字段
- laravel - Laravel 取消创建对象
- javascript - 带有自定义周标题的完整日历自定义议程周视图
- css - 如何在引导程序中减小放置项容器的大小