use*_*714 5 firebase android-recyclerview firebase-realtime-database firebaseui
我有一个Android聊天应用程序,它可以在本地SQLite DB和Firebase实时数据库中存储所有消息.
在RecyclerView中显示消息时,我从本地数据库中查询它们(因为本地存储了一些未存储在实时数据库中的附加数据).
我需要实时更新显示的消息发送和读取状态,这是我从实时数据库中获得的.
为recycleler视图的onBindViewHolder中的每条消息设置一个值事件监听器是否可以?
这样我只会监听当前显示在屏幕上的消息中的更改,而不会从服务器获取整个消息列表.(正是我需要的)
2个问题: - 这个解决方案是好还是有更好的方法? - 我需要删除回收器视图中不可见的项目的侦听器.我怎么做?
我没有使用FirebaseUI(我知道它解决了我的问题),但我想从本地数据库而不是从服务器提供数据,只从firebase实时数据库获取一个字段的更新.
这个解决方案很好还是有更好的方法?
是与否!我会建议您使用 FirebaseUI,这绝对是最好的选择,但您已经提到您不想使用它。因此,考虑到不使用 FirebaseUI,这似乎是最好的选择。[我建议您直接从 Firebase 人员那里获取有关此问题的评论,他们可以为您提供准确的答案。]您还应该知道,如果在视图离开屏幕后不删除回调,您最终会得到成百上千的听众(其中大多数是多余的)晃来晃去,吞噬着记忆,实际上什么也没做。
我需要删除回收器视图中已经不可见的项目的侦听器。我怎么做?
很简单。您可以使用该onViewDetachedFromWindow(MyViewHolder holder)
方法为recyclerView
您提供即将从视图中删除的处理程序。您可以使用此调用来删除回调。
如何?
followRef.removeEventListener(followListener);
Run Code Online (Sandbox Code Playgroud)
问题是 - 您需要回调的引用才能将其从该位置删除。您可以通过两种方式执行此操作。如果您有太多不同的听众,您可以创建一个hashmap
可以跟踪所有听众的听众。无论何时需要,您都可以获取侦听器的引用并将其删除。
另一种方法是:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
User user = data.get(position);
holder.name.setText(user.Name);
holder.surname.setText(user.Surname);
holder.id = user.id; //Id is same as the key used to point this user.
holder.followers.setText("Loading..");
DatabaseReference userFollowers = mRef.child(holder.id).child("Followers");
followListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
holder.followers.setText(String.valueOf(dataSnapshot.getValue()));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
userFollowers.addValueEventListener(followListener); //Adds a listener
}
@Override
public void onViewDetachedFromWindow(MyViewHolder holder) {
DatabaseReference followRef = mRef.child(holder.id).child("Followers");
followRef.removeEventListener(followListener); //Removes the listener
super.onViewDetachedFromWindow(holder);
}
Run Code Online (Sandbox Code Playgroud)
代码可能有小错误,我是按照这个问题写的。没有测试过。但我希望你明白了。
问题: [即使这件事有一个小问题,我仍在努力寻找最好的解决方案]:当您关闭包含 的活动时,不会为该特定时间屏幕上的项目调用该recyclerView
函数。onViewDetachedFromWindow(MyViewHolder holder)
因此,每当recyclerView
活动结束时,它都会保留很少的回调(与屏幕上可见项目的数量相同)。
就连我最近也深入研究了 Firebase 数据库。欢迎对答案提出任何改进/建议。
归档时间: |
|
查看次数: |
1853 次 |
最近记录: |