FirebaseRecyclerAdapter:从数据库下载后仅显示一次排序数据,防止在运行时排序

时间:2016-12-12 11:56:41

标签: android firebase

我在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的列表自动向上/向下移动。

到目前为止我尝试过的,

我尝试添加childEventListenerlistnerForSingleValueEventvalueEventListener,但我不知道要为onDataChange添加哪些代码,onCancelled,{{1} },onChildAdded和其他人。

我提到了像其他问题 Firebase android how to prevent FirebaseRecyclerAdapter automatically updating?
但我仍然不知道如何通过将星标记到帖子来防止列表自动更改。

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

1 个答案:

答案 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) {