Intereting Posts
Search.h-Нет такого файла или каталога при портировании libtiff на Android-tiff 4.0.1 Android – сохранить входной поток в файл Изменение порта по умолчанию (т.е. 5037), на котором запускается сервер adb Как использовать библиотеку поддержки Renderscript с Gradle Использование Scala с Java в Android Studio Имя псевдонима пакета или псевдоним Как построить apk в режиме выпуска с помощью maven Endless RecyclerView с ProgressBar для разбивки на страницы Добавить новый символ строки в строке Правильно ли хранить базы данных с кодировкой base64 внутри базы данных? Недостаточно градиента в созданном проекте Android Вопрос с «@id» и «@ + id» в позиционировании в Relative Layout При обработке строки csv с пустым конечным полем myString.split (",") возвращает неправильное количество записей массива Как я могу справиться с постоянной проблемой Eclipse, висящей на моем рабочем пространстве? Каков правильный способ установки приложения Android при использовании параметров аромата?

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

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

Например, если у меня есть 5 элементов в моем ListView, все они будут отображаться на одном экране. Но если у меня 7 или более, мой 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.