5

Używam biblioteki animacji RecyclerView znalezionej here. Używam także FirebaseRecyclerAdapter, dokumentacji znajdującej się pod numerem here.Firebase RecyclerView - Przewiń animację po dodaniu nowego elementu

Zasadniczo chcę przewinąć do góry widoku RecyclerView, ponieważ elementy są dodawane do Firebase. Jest to trudne, ponieważ w rzeczywistości nie inicjalizuję adaptera za pomocą tablicy ArrayList() ani żadnej innej listy. Firebase obsługuje wszystkie funkcje zarządzania danymi za pośrednictwem FirebaseRecyclerAdapter.

Tu jest mój podstawowy onCreateView():

@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; 
} 

A mój adapter:

@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); 
} 

Jak przewijać do góry RecylcerView jako elementy są dodawane? Zauważ, że wzywam:

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

ponieważ muszę odwrócić kolejność danych w Firebase.

Odpowiedz

4

I był rzeczywiście w stanie znaleźć w dokumentacji Firebase UI - konieczne jest, aby nazwać) Metoda .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

Szukałem rozwiązania tego sam przez długi czas - dzięki –