5

hereというRecyclerViewアニメーションライブラリを使用しています。 FirebaseRecyclerAdapter(here)のドキュメントも使用しています。Firebase RecyclerView - 新しいアイテムが追加されたときにアニメーションをスクロール

基本的に、アイテムがFirebaseに追加されるときに、RecyclerViewの上部にスクロールしたいと思っています。 ArrayList()やそのリストでアダプタを実際に初期化しているわけではないので、やっかいです。 Firebaseは、FirebaseRecyclerAdapterを通じてすべてのデータ管理を処理します。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    final View v = inflater.inflate(R.layout.fragment_new, container, false); 
    Log.v("TAG", "ON CREATE CALLED FROM NEW"); 

    mRecyclerview = (RecyclerView) v.findViewById(R.id.list); 
    mRecyclerview.setItemAnimator(new FadeInUpAnimator()); 


    mLayoutManager = new LinearLayoutManager(getContext()); 
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mLayoutManager.setReverseLayout(true); 
    mLayoutManager.setStackFromEnd(true); 

    mRecyclerview.setLayoutManager(mLayoutManager); 

    return v; 
} 

そして、私のアダプタ:ここ

は、私の基本的なonCreateView()でアイテムが追加されるよう

@Override 
public void onStart() { 
    super.onStart(); 

    mFireAdapter = new FirebaseRecyclerAdapter<Poll, PollHolder>(Poll.class, R.layout.latest_item, PollHolder.class, mBaseRef.child("Polls")) { 
     @Override 
     protected void populateViewHolder(PollHolder viewHolder, Poll model, int position) { 
      mRecyclerview.scrollToPosition(position); 
      viewHolder.mPollQuestion.setText(model.getQuestion()); 
      Picasso.with(getActivity().getApplicationContext()) 
        .load(model.getImage_URL()) 
        .fit() 
        .into(viewHolder.mPollImage); 
      Log.v("TAG", model.getQuestion()); 
      Log.v("TAG", model.getImage_URL()); 
     } 
    }; 

    mRecyclerview.setAdapter(mFireAdapter); 
} 

にはどうすればRecylcerViewの最上部までスクロールでしょうか?

mLayoutManager.setReverseLayout(true); 
mLayoutManager.setStackFromEnd(true); 

を私はFirebase内のデータの順序を逆にする必要があるので:私は呼び出していることに注意してください。

私は実際にFirebase UIのドキュメントで見つけることができた

答えて

4

- .registerAdapterDataObserver(を呼び出す必要がある)方法:私は長い間、これを解決するために自分を見てきた

@Override 
public void onStart() { 
    super.onStart(); 

    mFireAdapter = new FirebaseRecyclerAdapter<Poll, PollHolder>(Poll.class, R.layout.latest_item, PollHolder.class, mBaseRef.child("Polls")) { 
     @Override 
     protected void populateViewHolder(PollHolder viewHolder, Poll model, int position) { 
      viewHolder.mPollQuestion.setText(model.getQuestion()); 
      Picasso.with(getActivity().getApplicationContext()) 
        .load(model.getImage_URL()) 
        .fit() 
        .into(viewHolder.mPollImage); 
      Log.v("TAG", model.getQuestion()); 
      Log.v("TAG", model.getImage_URL()); 
     } 
    }; 

    mRecyclerview.setAdapter(mFireAdapter); 

    mFireAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      super.onItemRangeInserted(positionStart, itemCount); 
      int friendlyMessageCount = mFireAdapter.getItemCount(); 
      int lastVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition(); 

      // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll 
      // to the bottom of the list to show the newly added message. 
      if (lastVisiblePosition == -1 || 
        (positionStart >= (friendlyMessageCount - 1) && lastVisiblePosition == (positionStart - 1))) { 
       mRecyclerview.scrollToPosition(positionStart); 
      } 
     } 
    }); 
} 
+0

- 感謝を –

関連する問題