2016-12-12 29 views
1

我已經參考了Firebase/quickstart-android/database中的以下片段作爲參考。FirebaseRecyclerAdapter:從數據庫下載後僅顯示一次排序數據,防止在運行時排序

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,但我不知道onDataChangeonCancelledonChildAddedonChildChanged和其他添加哪些代碼。

我提到的其他問題,如
Firebase android how to prevent FirebaseRecyclerAdapter automatically updating?
但我仍然不知道該做些什麼來防止名單得到通過標記星後自動改變。

希望任何人都可以幫助我解決這個問題。

回答

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