Intereting Posts
Создайте поток пользовательского интерфейса вручную в Android, чтобы увеличить его размер небольшого стека Где я могу найти список элементов стиля Android? SQLiteConstraintException: код ошибки 19: ограничение не выполнено Android Удалить файл с помощью DDMS Как читать данные из Firebase ONCE с помощью java / android? Использование `onRetainCustomNonConfigurationInstance` для сохранения данных при изменении конфигурации Android: проблемы с Unicode / Charset при отправке SMS (sendTextMessage) Оптимальная практика подключения TCP к TCP При использовании clipToPadding в ListView элементы перерабатываются преждевременно Firebase и Crashlytics – Какой из них использовать? Android – проведите пальцем влево | вправо. Обнаружение жестов Краткий способ написания новых классов DialogPreference? Распознавание активности не работает после того, как «Wi-Fi и местоположение мобильной сети» выключится и включится Можем ли мы использовать CSS в форматах Android для компонентов Android? Как получить количество миллисекунд, прошедших сегодня

Как проверить, имеет ли у моего ListView прокручиваемое количество элементов?

Откуда вы знаете, есть ли в списке ListView достаточно количество элементов, чтобы он мог прокручиваться?

Например, если у меня есть 5 элементов в моем ListView, все они будут отображаться на одном экране. Но если у меня 7 или более, мой ListView начинает прокручиваться. Как узнать, может ли мой список прокручиваться программно?

Solutions Collecting From Web of "Как проверить, имеет ли у моего ListView прокручиваемое количество элементов?"

Ответ Диегоана не может различаться, когда последний элемент частично отображается на экране. Вот решение этой проблемы.

Во-первых, ListView должен отображаться на экране, прежде чем мы сможем проверить, прокручивается ли его контент. Это можно сделать с помощью ViewTreeObserver:

 ViewTreeObserver observer = listView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (willMyListScroll()) { // Do something } } }); 

И вот willMyListScroll() :

 boolean willMyListScroll() { int pos = listView.getLastVisiblePosition(); if (listView.getChildAt(pos).getBottom() > listView.getHeight()) { return true; } else { return false; } } 

Согласно моему комментарию на ответ Майка Ортиса, я считаю, что его ответ неверен:

GetChildAt () учитывает только те дети, которые видны на экране. Тем временем getLastVisiblePosition возвращает индекс на основе адаптера. Поэтому, если lastVisiblePosition – 8, потому что это 9-й элемент в списке, и на экране есть только 4 видимых элемента, вы получите крах. Проверьте его, вызвав getChildCount () и увидите. Индексы для getChildAt не совпадают с индексами для набора данных. Проверьте это: ListView getChildAt возвращает null для видимых детей

Вот мое решение:

 public boolean isScrollable() { int last = listView.getChildCount()-1; //last visible listitem view if (listView.getChildAt(last).getBottom()>listView.getHeight() || listView.getChildAt(0).getTop()<0) { //either the first visible list item is cutoff or the last is cutoff return true; } else{ if (listView.getChildCount()==listView.getCount()) { //all visible listitem views are all the items there are (nowhere to scroll) return false; } else{ //no listitem views are cut off but there are other listitem views to scroll to return true; } } } 

Вы не можете обнаружить это, прежде чем андроид отобразит экран с помощью listView . Тем не менее, вы можете абсолютно обнаружить этот пост-рендер.

 boolean willMyListScroll() { if(listView.getLastVisiblePosition() + 1 == listView.getCount()) { return false; } return true; } 

Что это значит, проверьте, отображается ли в видимом окне listView ВСЕ элементы списка. Если это возможно, то listView никогда не будет прокручиваться, и getLastVisiblePosition() всегда будет равно общему количеству элементов в списке данных.

Это код, который я написал для показа изображения после последней строки списка:

 public class ShowTheEndListview { private ImageView the_end_view; private TabbedFragRootLayout main_layout; private ListView listView; private float pas; private float the_end_img_height; private int has_scroll = -1; public ShowTheEndListview(float height) { the_end_img_height = height; pas = 100 / the_end_img_height; } public void setData(ImageView the_end_view, TabbedFragRootLayout main_layout, ListView listView) { this.the_end_view = the_end_view; this.main_layout = main_layout; this.listView = listView; } public void onScroll(int totalItemCount) { if(totalItemCount - 1 == listView.getLastVisiblePosition()) { int pos = totalItemCount - listView.getFirstVisiblePosition() - 1; View last_item = listView.getChildAt(pos); if (last_item != null) { if(listHasScroll(last_item)) { // Log.e(TAG, "listHasScroll TRUE"); } else { // Log.e(TAG, "listHasScroll FALSE"); } } } } private boolean listHasScroll(View last_item) { if(-1 == has_scroll) { has_scroll = last_item.getBottom() > (main_layout.getBottom() - the_end_img_height - 5) ? 1 : 0; } return has_scroll == 1; } public void resetHasScroll() { has_scroll = -1; } } 

AbsListView включает в себя следующее:

 /** * Check if the items in the list can be scrolled in a certain direction. * * @param direction Negative to check scrolling up, positive to check scrolling down. * @return true if the list can be scrolled in the specified direction, false otherwise. * @see #scrollListBy(int) */ public boolean canScrollList(int direction); 

Вам необходимо переопределить layoutChildren () и использовать его в этом:

 @Override protected void layoutChildren() { super.layoutChildren(); isAtBottom = !canScrollList(1); isAtTop = !canScrollList(-1); } 

Вот как я привык проверять

 if (listView.getAdapter() != null && listView.getLastVisiblePosition() == listView.getAdapter().getCount() - 1 && listView.getChildAt(listView.getChildCount() - 1).getBottom() == listView.getBottom()) 

Если он дает true, тогда список находится внизу

Используйте setOnScrollListener , применяя обратный вызов к OnScrollListener , вы можете определить, происходит ли прокрутка с использованием заданных констант и соответствующим образом обрабатывает ситуацию.

  boolean listBiggerThanWindow = appHeight - 50 <= mListView.getHeight(); Toast.makeText(HomeActivity.this, "list view bigger that window? " + listBiggerThanWindow, Toast.LENGTH_LONG) .show(); if (listBiggerThanWindow) { // do your thing here... } 

Вы можете получить измерения в onCreate (), вызвав post (Runnable) в View.