Как проверить, имеет ли у моего ListView прокручиваемое количество элементов?
Откуда вы знаете, есть ли в списке ListView достаточно количества элементов, чтобы он мог прокручиваться?
Например, если у меня есть 5 элементов в моем ListView, все они будут отображаться на одном экране. Но если у меня 7 или более, мой ListView начинает прокручиваться. Как узнать, может ли мой список прокручиваться программно?
Ответы
Ответ 1
Ответ Diegosan не может различаться, если последний элемент частично отображается на экране. Вот решение этой проблемы.
Во-первых, 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;
}
}
Ответ 2
В соответствии с моим комментарием о ответе Майка Ортиза, я считаю, что его ответ неверен:
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;
}
}
}
Ответ 3
Вы не можете обнаружить это, прежде чем андроид отобразит экран с помощью listView
. Однако вы можете абсолютно определить этот пост-рендер.
boolean willMyListScroll() {
if(listView.getLastVisiblePosition() + 1 == listView.getCount()) {
return false;
}
return true;
}
Что это значит, проверьте, отображается ли в окне listView
все элементы списка. Если это возможно, то listView
никогда не будет прокручиваться, а getLastVisiblePosition()
всегда будет равняться общему количеству элементов в списке данных.
Ответ 4
Это код, который я написал для показа изображения после последней строки списка:
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;
}
}
Ответ 5
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);
}
Ответ 6
Вот как я использовал для проверки
if (listView.getAdapter() != null
&& listView.getLastVisiblePosition() == listView.getAdapter().getCount() - 1
&& listView.getChildAt(listView.getChildCount() - 1).getBottom() == listView.getBottom())
если он дает true, тогда список внизу
Ответ 7
Используйте setOnScrollListener, применив обратный вызов к OnScrollListener, вы можете определить, происходит ли прокрутка с использованием заданных констант и соответствующим образом обрабатывает ситуацию.
Ответ 8
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.