2015-05-22 7 views
22

У меня есть RecyclerView, который находится внутри CardView. CardView имеет высоту 500dp, но я хочу сократить эту высоту, если размер RecyclerView меньше. Итак, интересно, есть ли какой-нибудь прослушиватель, который вызывается, когда RecyclerView закончил укладывать свои предметы в первый раз, что позволяет установить высоту RecyclerView на высоту CardView (если меньше 500 дп).Как узнать, когда RecyclerView завершил установку элементов?

+0

Нашел что-нибудь? Мне это тоже нужно. – Magnas

+0

Связанный: http://stackoverflow.com/questions/32496681/how-to-know-when-data-is-loaded-inside-custom-recyclerview –

ответ

29

Мне также нужно было выполнить код после того, как мой просмотр ресайклера закончил накачивать все элементы. Я попытался проверить в onBindViewHolder в моем адаптере, если позиция была последней, а затем уведомил наблюдателя. Но в этот момент просмотр recycler все еще не был полностью заполнен.

Как RecyclerView инвентарь ViewGroup, this anwser был очень полезным. Вам просто нужно добавить OnGlobalLayoutListener к recyclerView:

View recyclerView=findViewById(R.id.myView); 
     recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 
        //At this point the layout is complete and the 
        //dimensions of recyclerView and any child views are known. 
       } 
      }); 
+13

Этот метод называется несколько раз, и не только после его завершения. Это не сработало для меня – Juancho

+5

@Juancho работает, если вы удалите слушателя после того, как вы закончите с ним на 'onGlobalLayout'? –

+3

@NeonWarge да, он работает, удаляя слушателя при первом вызове, спасибо! – Juancho

-2

То, что сработало для меня, чтобы добавить слушателя после установки адаптера RecyclerView.

ServerRequest serverRequest = new ServerRequest(this); 
serverRequest.fetchAnswersInBackground(question_id, new AnswersDataCallBack() 
{ 
    @Override 
    public void done(ArrayList<AnswerObject> returnedListOfAnswers) 
    { 
     mAdapter = new ForumAnswerRecyclerViewAdapter(returnedListOfAnswers, ForumAnswerActivity.this); 
     recyclerView.setAdapter(mAdapter); 
     recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       progressDialog.dismiss(); 
      } 
     }); 
    } 
}); 

Это отклоняет «progressDialog» после того,

15

Рабочая модификация @andrino anwser.

Как @Juancho указал в комментарии выше. Этот метод называется несколько раз. В этом случае мы хотим, чтобы он срабатывал только один раз.

создание пользовательского слушателя с экземпляром, например

private RecyclerViewReadyCallback recyclerViewReadyCallback; 

public interface RecyclerViewReadyCallback { 
    void onLayoutReady(); 
} 

Затем установите OnGlobalLayoutListener на ваш RecyclerView

recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       if (recyclerViewReadyCallback != null) { 
        recyclerViewReadyCallback.onLayoutReady(); 
       } 
       recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     }); 

после этого вам нужно только реализовать пользовательский приемник с кодом

recyclerViewReadyCallback = new RecyclerViewReadyCallback() { 
      @Override 
      public void onLayoutReady() { 
       // 
       //here comes your code that will be executed after all items has are laid down 
       // 
      } 
}; 
1

У меня есть борется с попыткой удалить OnGlobalLayoutListener после того, как он запускается, но который выбрасывает IllegalStateException. Так что мне нужно, чтобы просмотреть мой recyclerView ко второму элементу, что я сделал, чтобы проверить, если он уже есть дети, и если это первый раз, это правда, только тогда я свиток:

public class MyActivity extends BaseActivity implements BalanceView { 
    ... 
    private boolean firstTime = true; 
    ... 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 

     ViewTreeObserver vto = myRecyclerView.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       if (myRecyclerView.getChildCount() > 0 && MyActivity.this.firstTime){ 
        MyActivity.this.firstTime = false; 
        scrollToSecondPosition(); 
       } 
      } 
     }); 
    } 
    ... 
    private void scrollToSecondPosition() { 
     // do the scroll 
    } 
} 

НТН кто то!

(Конечно, это было вдохновлено на ответы @andrino и @Phatee)

Смежные вопросы