Могу ли я узнать, прокручивается ли мой ListView вниз? Под этим я подразумеваю, что последний элемент полностью виден.
105
Отредактировано :
Поскольку я исследовал эту конкретную тему в одном из своих приложений, я могу написать расширенный ответ для будущих читателей этого вопроса.
Внедрите OnScrollListener
, установите свои ListView
, onScrollListener
и тогда вы сможете все правильно обрабатывать.
Например:
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount)
{
switch(lw.getId())
{
case R.id.your_list_id:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount)
{
if(preLast!=lastItem)
{
//to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
}
}
}
listview
ISstackFromBottom
? Я пробовал,if (0 == firstVisibleItem){//listviewtop}
но мне постоянно звонят.Поздний ответ, но если вы просто хотите проверить, прокручивается ли ваш ListView до конца или нет, без создания прослушивателя событий, вы можете использовать этот оператор if:
Сначала он проверяет, отображается ли последняя возможная позиция. Затем он проверяет, совпадает ли нижняя часть последней кнопки с нижней частью ListView. Вы можете сделать что-то подобное, чтобы узнать, полностью ли он находится наверху:
источник
getChildCount()
возвращает представления в группе просмотра, что при повторном использовании представления не совпадает с количеством элементов в адаптере. Однако, поскольку ListView происходит от AdapterView, вы можете использовать егоgetCount()
непосредственно в ListView.Как я это сделал:
источник
Что-то вроде:
источник
Это сработало для меня.
источник
Это может быть
источник
Было довольно болезненно иметь дело с прокруткой, определяя, когда она завершена, и она действительно находится внизу списка (а не внизу видимого экрана) и запускает мою службу только один раз, чтобы получить данные из Интернета. Однако сейчас он работает нормально. Код приведен ниже для всех, кто сталкивается с такой же ситуацией.
ПРИМЕЧАНИЕ. Мне пришлось переместить код, связанный с адаптером, в onViewCreated вместо onCreate и обнаруживать прокрутку в основном следующим образом:
Здесь RideListSimpleCursorAdapter.REACHED_THE_END - дополнительная переменная в моем SimpleCustomAdapter, которая задается следующим образом:
Только когда оба этих условия соблюдаются, это означает, что я действительно нахожусь в конце списка и что моя служба будет запущена только один раз. Если я не улавливаю REACHED_THE_END, даже прокрутка назад запускает службу снова, пока последний элемент находится в поле зрения.
источник
canScrollVertically(int direction)
работает для всех представлений и, кажется, делает то, что вы просили, с меньшим количеством кода, чем большинство других ответов. Вставьте положительное число, и если результат окажется ложным, вы окажетесь внизу.то есть:
if (!yourView.canScrollVertically(1)) { //you've reached bottom }
источник
Чтобы немного расширить один из приведенных выше ответов, это то, что мне пришлось сделать, чтобы он работал полностью. Кажется, что внутри ListViews есть около 6dp встроенного заполнения, а onScroll () вызывается, когда список был пуст. Это обрабатывает обе эти вещи. Возможно, его можно было бы немного оптимизировать, но написано больше для ясности.
Боковое примечание: я пробовал несколько разных методов преобразования dp в пиксель, и этот dp2px () оказался лучшим.
источник
Я пока не могу комментировать, потому что у меня недостаточно репутации, но в ответах @Ali Imran и @Wroclai я думаю, что чего-то не хватает. С этим фрагментом кода, как только вы обновите preLast, он никогда больше не выполнит журнал. В моей конкретной проблеме я хочу выполнять некоторую операцию каждый раз, когда прокручиваю вниз, но как только preLast обновляется до LastItem, эта операция больше не выполняется.
}
С этим «else» теперь вы можете выполнять свой код (в данном случае Log) каждый раз, когда вы снова прокручиваете вниз.
источник
источник
Чтобы ваш список вызывал, когда список дойдет до последнего, и если произойдет ошибка, то это не вызовет endoflistview снова . Этот код также поможет в этом сценарии.
где LIST_UP_THRESHOLD_VALUE может быть любым целочисленным значением (я использовал 5), где ваш список прокручивается вверх, и при возврате к концу это снова вызовет конец представления списка.
источник
Я нашел очень хороший способ автоматически загрузить следующий набор страниц, не требующий вашей собственной
ScrollView
(как того требует принятый ответ).В ParseQueryAdapter есть метод,
getNextPageView
который позволяет вам предоставить свое собственное пользовательское представление, которое появляется в конце списка, когда есть больше данных для загрузки, поэтому он срабатывает только тогда, когда вы достигли конца текущего набора страниц. (по умолчанию это режим «Загрузить еще ..»). Этот метод вызывается только тогда, когда есть больше данных для загрузки, поэтому это отличное место для вызова.loadNextPage();
Таким образом, адаптер выполняет за вас всю тяжелую работу по определению, когда должны быть загружены новые данные, и он не будет вызываться вообще, если у вас есть достиг конца набора данных.Затем внутри вашей активности / фрагмента вам просто нужно установить адаптер, и новые данные будут автоматически обновляться для вас, как по волшебству.
источник
Чтобы определить, является ли последний элемент полностью видимым , вы можете просто добавить расчет в нижней части последнего видимого элемента представления с помощью
lastItem.getBottom()
.источник
Я пошел с:
источник
В методе
getView()
(производного отBaseAdapter
класса) можно проверить, совпадает ли позиция текущего представления со списком элементов вAdapter
. Если это так, то это означает, что мы достигли конца / конца списка:источник
Я нахожу лучший способ определить конец прокрутки списка внизу, сначала обнаружите конец прокрутки с помощью этой
реализации onScrollListener, чтобы обнаружить конец прокрутки в ListView
наконец объедините ответ Мартейна
источник
Большое спасибо постерам в stackoverflow! Я объединил некоторые идеи и создал прослушиватель классов для действий и фрагментов (так что этот код более многоразовый, что делает код быстрее писать и намного чище).
Все, что вам нужно сделать, когда вы получили мой класс, - это реализовать интерфейс (и, конечно, создать для него метод), который объявлен в моем классе, и создать объект этого класса, передавая аргументы.
источник
Вам нужно добавить пустой ресурс нижнего колонтитула xml в свой listView и определить, отображается ли этот нижний колонтитул.
Затем в вашем слушателе прокрутки listView вы делаете это
источник
Если вы установите тег для представления последнего элемента списка, позже вы можете получить представление с тегом, если представление имеет значение null, это потому, что представление больше не загружается. Как это:
затем, если вам нужно знать, загружен ли последний элемент
источник
Janwilx72 прав, но его минимальный SDK равен 21, поэтому я создаю этот метод :
для ScrollOrientation:
Может, поздно, только для опоздавших。
источник
Если вы используете специальный адаптер со своим списком (большинство людей так делают!), Здесь дается прекрасное решение!
https://stackoverflow.com/a/55350409/1845404
Метод getView адаптера определяет, когда список был прокручен до последнего элемента. Он также добавляет коррекцию для тех редких случаев, когда вызывается некоторая более ранняя позиция даже после того, как адаптер уже отрендерил последнее представление.
источник
Я так и сделал, и у меня работает:
источник
Это прокрутит ваш список до последней записи.
источник