我在Firebase/quickstart-android/database中引用了下面的片段作为参考。
public class MyTopPostsFragment extends PostListFragment {
public MyTopPostsFragment() {}
@Override
public Query getQuery(DatabaseReference databaseReference) {
// [START my_top_posts_query]
// My top posts by number of stars
String myUserId = getUid();
Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId)
.orderByChild("starCount");
// [END my_top_posts_query]
return myTopPostsQuery;
}
}
我想从Firebase
数据库中读取数据,然后在用户启动应用程序时按starCount
对数据进行排序,就像快速入门示例中所示。
这已通过示例实现。
现在问题,
我不希望它在用户使用应用程序时增加starCount
时自动对数据进行排序。当用户单击star
按钮时,它会导致数据上下移动。我只想更新Firebase数据库中的starCount
。
但是使用上面的代码,每当用户标记任何已加星标的帖子时,它会根据基于starCount
的列表自动向上/向下移动。
到目前为止我尝试过的,
我尝试添加childEventListener
,listnerForSingleValueEvent
和valueEventListener
,但我不知道要为onDataChange
添加哪些代码,onCancelled
,{{1} },onChildAdded
和其他人。
我提到了像其他问题
Firebase android how to prevent FirebaseRecyclerAdapter automatically updating?
但我仍然不知道如何通过将星标记到帖子来防止列表自动更改。
希望有人能帮助我解决这个问题。
答案 0 :(得分:1)
问题:当将星标记到帖子时,它会在列表中向前移动,而排名较高的帖子会排在最前面。
原因: FirebaseRecyclerAdapter
public FirebaseRecyclerAdapter(Class<T> modelClass, int modelLayout, Class<VH> viewHolderClass, Query ref) {
this.mModelClass = modelClass;
this.mModelLayout = modelLayout;
this.mViewHolderClass = viewHolderClass;
this.mSnapshots = new FirebaseArray(ref);
this.mSnapshots.setOnChangedListener(new OnChangedListener() {
public void onChanged(EventType type, int index, int oldIndex) {
switch(null.$SwitchMap$com$firebase$ui$database$FirebaseArray$OnChangedListener$EventType[type.ordinal()]) {
case 1:
FirebaseRecyclerAdapter.this.notifyItemInserted(index);
break;
case 2:
FirebaseRecyclerAdapter.this.notifyItemChanged(index);
break;
case 3:
FirebaseRecyclerAdapter.this.notifyItemRemoved(index);
break;
case 4:
FirebaseRecyclerAdapter.this.notifyItemMoved(oldIndex, index);
break;
default:
throw new IllegalStateException("Incomplete case statement");
}
}
});
}
在这里,您可以看到,只要适配器的任何项目发生更改,它就会得到通知,并且列表会根据您在查询中提供的顺序重新排列。
现有代码: MyTopPostFragment
在此您生成的查询将始终用于显示列表,请记住此查询将在适配器通知时使用以及我告诉上方。
public class MyTopPostsFragment extends PostListFragment {
public MyTopPostsFragment() {}
@Override
public Query getQuery(DatabaseReference databaseReference) {
String myUserId = getUid();
Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId)
.orderByChild("starCount");
return myTopPostsQuery;
}
}
解决方案:
MyTopPostFragment - 更改(从查询中删除订单)
@Override
public Query getQuery(DatabaseReference databaseReference) {
String myUserId = getUid();
Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId);
// .orderByChild("starCount"); Removed order from here
return myTopPostsQuery;
}
PostListFragment - 更改(添加要查询的订单)
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Set up Layout Manager, reverse layout
mManager = new LinearLayoutManager(getActivity());
mManager.setReverseLayout(true);
mManager.setStackFromEnd(true);
mRecycler.setLayoutManager(mManager);
// Set up FirebaseRecyclerAdapter with the Query
Query postsQuery = getQuery(mDatabase);
postsQuery.orderByChild("starCount"); // Added Order HERE
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post,
PostViewHolder.class, postsQuery) {