Android: обнаружение, если ListView имеет полосу прокрутки (после установки новых данных)

У меня есть ArrayAdapter, связанный с ListView.

mListView.setAdapter(mArrayAdapter);

Всякий раз, когда я возвращаю данные ArrayList в ArrayAdapter:

 mArrayAdapter.clear(); mArrayAdapter.addAll(mArrayList); mArrayAdapter.notifyDataSetChanged() 

ListView получает правильное обновление

Однако, если сразу после трех указанных выше строк я вызываю свой пользовательский метод mListView.hasScrollbar() чтобы определить, имеет ли listview полосу прокрутки или нет, я получаю null lastVisibleItem :

 public boolean hasScrollbar() { View lastVisibleItem = (View) getChildAt(getChildCount() - 1); if (lastVisibleItem.getBottom()>=getHeight()) { return true; } return false; } 

Означает ли это, что список еще освежает?

Мой главный вопрос:
Как я могу проверить, имеет ли listview полосу прокрутки после перезагрузки адаптера новыми данными?

Спасибо за любую помощь!

Использование getLastVisiblePosition / getFirstVisiblePosition является допустимым методом обнаружения того, что у вас есть прокрутка или нет в представлении списка (по сравнению с его сравнением с getCount () и выполните свою математику ofc). Проблема, которую вы уже знаете, заключается в том, что вы пытаетесь проверить синхронизацию. Чтобы синхронизировать ваш запрос, когда адаптер уже заполнил ваши данные списка и обновленные изменения, вам нужно отправить запрос на отправку в список, который будет стекать это ходатайство в очередь сообщений адаптера.

 yourAdapter.notifyDataSetChanged(); yourAdapter.getListView().post(new Runnable() { @Override public void run() { //your code here } }); 

Обязательно позвоните, что после notifySetDataChanged() конечно. Потому что вы хотите, чтобы список обновлялся до проверки.

Я думаю, что ваш вопрос равен «как узнать, содержит ли список, который должен отображать элементы, отображаемые на нескольких экранах»?

Поэтому я предлагаю использовать listView.getFirstVisiblePosition () и getLastVisiblePosition (), чтобы сообщить об этом.