gpt4 book ai didi

android - FirebaseRecyclerAdapter : Show sorted data only once after downloaded from database, 防止在运行时排序

转载 作者:行者123 更新时间:2023-11-30 00:50:33 26 4
gpt4 key购买 nike

我在 Firebase/quickstart-android/database 中提到了下面的 fragment 作为引用。

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 时,它会导致数据向上/向下移动按钮。我只想更新starCount在 Firebase 数据库中。

但是使用上面的代码,每当用户将任何帖子标记为已加星标时,都会根据 starCount 向上/向下移动到列表中自动。


到目前为止我已经尝试过,

我尝试添加 childEventListener , listnerForSingleValueEventvalueEventListener但我不知道要为 onDataChange 添加什么代码, onCancelled , onChildAdded , onChildChanged和其他人。

我提到了其他问题,例如
Firebase android how to prevent FirebaseRecyclerAdapter automatically updating?
但我仍然不确定如何通过标记星标来防止列表自动更改。

希望有人能帮我解决这个问题。

最佳答案

问题:当给帖子加注星标时,它会在列表中向前移动,排名靠前的帖子会排在最前面。

原因: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) {

关于android - FirebaseRecyclerAdapter : Show sorted data only once after downloaded from database, 防止在运行时排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41100356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com