我有这样的场景,在我的应用程序中,我尝试查询子节点并将其传递到列表中的 recyclerview 适配器,当我向上滚动回收器 View 项目并且有人插入了帖子时,就会出现问题,我的 recyclerview 再次来到第一个帖子项目,而且我正在使用带有三个 fragment 的 viewpager,无论我在什么 fragment 上,如果有人插入了帖子如何解决这个问题,我都会回滚到第一个 fragment 。 我已经按照下面提到的方式实现了这一点。
我想的一种方式是,我认为我不会听子事件的更改,而是查询结果并稍后填充 recyclerview 不听子事件,这样一切都会按原样显示,我不知道在 firebase 中你怎么办在不实现监听器的情况下检索值我尝试了 singleValueEventListener,这样行为仍然相同,回滚到第一个项目或第一个 fragment
指导我解决如何摆脱这种行为的问题。
Query query= databasePostsReference.orderByChild("timestamp");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<UserPostPOJO> listposts = new ArrayList<UserPostPOJO>();
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: entered list adding");
UserPostPOJO post =
snapshot.getValue(UserPostPOJO.class);
listposts.add(0,post);
}
if(listposts.isEmpty()){
empty.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
}
else
{
empty.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
makelist(listposts);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
private void makelist(List<UserPostPOJO> listposts) {
list = listposts;
Log.d(TAG,"size is "+ list.size()+"");
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new
LinearLayoutManager(getActivity()));
CustomRecyclerViewAdapter adapter = new
CustomRecyclerViewAdapter(getActivity(), list,"recentfragment");
recyclerView.setAdapter(adapter);
}
最佳答案
有一个名为 removeEventListener()
的方法,您可以调用该方法来删除特定的事件监听器
。您从数据库中获取数据,然后调用此方法。因此,为了使其工作,请使用以下代码:
databaseReference.removeEventListener(valueEventListener);
其中databaseReference
是您最初放置监听器的引用。
更多详情请阅读offcial doc .
希望有帮助。
关于android - 如何仅检索一次 Firebase 数据库值而不监听子值,即使它们已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166245/