У меня есть RecyclerView
, который находится внутри CardView
. CardView
имеет высоту 500dp, но я хочу сократить эту высоту, если размер RecyclerView
меньше. Итак, интересно, есть ли какой-нибудь прослушиватель, который вызывается, когда RecyclerView
закончил укладывать свои предметы в первый раз, что позволяет установить высоту RecyclerView
на высоту CardView
(если меньше 500 дп).Как узнать, когда RecyclerView завершил установку элементов?
ответ
Мне также нужно было выполнить код после того, как мой просмотр ресайклера закончил накачивать все элементы. Я попытался проверить в 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.
}
});
Этот метод называется несколько раз, и не только после его завершения. Это не сработало для меня – Juancho
@Juancho работает, если вы удалите слушателя после того, как вы закончите с ним на 'onGlobalLayout'? –
@NeonWarge да, он работает, удаляя слушателя при первом вызове, спасибо! – Juancho
То, что сработало для меня, чтобы добавить слушателя после установки адаптера 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» после того,
Рабочая модификация @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
//
}
};
У меня есть борется с попыткой удалить 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)
- 1. Windows Phone: как узнать, когда Deployment.Current.Dispatcher.BeginInvoke завершил?
- 2. Как узнать, когда UserControl завершил запуск события?
- 3. Как узнать, когда компонент MXML полностью завершил создание?
- 4. Как узнать, когда исполняемый код Chrome завершил выполнение?
- 5. Как узнать, когда браузер завершил обработку изображения после его загрузки?
- 6. Как мой код может узнать, когда Firebase завершил получение данных?
- 7. Как узнать, когда шаблон из пакета Meteor завершил рендеринг
- 8. Как узнать, когда объект на странице завершил загрузку
- 9. Как узнать, что winsock завершил получение файла?
- 10. Как узнать, что SIP завершил вызов?
- 11. Как узнать, что актер завершил свое исполнение?
- 12. Как узнать, завершил ли видеомагнитофон кассета
- 13. Как узнать, что запрос async завершил ответ.
- 14. Сообщите, когда stringByEvaluatingJavaScriptFromString: завершил
- 15. Как узнать, когда данные загружаются внутри пользовательского RecyclerView?
- 16. Определение, когда процесс завершил инициализацию
- 17. Определите, когда UITextView завершил прокрутку
- 18. Как определить, когда TileOverlay завершил загрузку плитки?
- 19. Как узнать, завершил ли браузер gecko загрузку веб-страницы?
- 20. Зная, когда Firebase завершил вызов API?
- 21. PyCharm: Как узнать, завершил ли ранее отправленный выбор на консоли?
- 22. Переупорядочение элементов в RecyclerView
- 23. Как получить ViewHolder элементов RecyclerView
- 24. Android - определение, когда поток завершил выполнение
- 25. Как узнать, что Event.respondWith завершил (обратный вызов для Event.respondWith()
- 26. Как узнать, завершил ли транскодер Amazon Elastic Transcoder транскодирование
- 27. Как узнать, что paintComponent (Graphics g) завершил работу (Java)?
- 28. Как узнать, что UITableView завершил загрузку данных в swift
- 29. Как узнать индекс элементов?
- 30. Как узнать, когда завершено открытие проекта
Нашел что-нибудь? Мне это тоже нужно. – Magnas
Связанный: http://stackoverflow.com/questions/32496681/how-to-know-when-data-is-loaded-inside-custom-recyclerview –