Получить все видимые объекты на lListView
У меня есть ListView, который содержит больше элементов, которые я могу отобразить за один раз. Теперь я хочу, чтобы индекс был отключен от всех элементов, которые полностью видимы (- > исключая те, которые только частично видны).
В этот момент я использую getFirstVisiblePosition()
и getLastVisiblePosition()
в for-loop
для их итерации, но этот метод не является точным, как я хочу.
Есть ли лучшее решение?
Ответы
Ответ 1
ListView упорядочивает свои строки в ниспадающем списке, доступ к которому можно получить с помощью getChildAt()
. Так что вы хотите довольно просто. Позвольте получить первый и последний виды, а затем проверить, полностью ли они видимы или нет:
// getTop() and getBottom() are relative to the ListView,
// so if getTop() is negative, it is not fully visible
int first = 0;
if(listView.getChildAt(first).getTop() < 0)
first++;
int last = listView.getChildCount() - 1;
if(listView.getChildAt(last).getBottom() > listView.getHeight())
last--;
// Now loop through your rows
for( ; first <= last; first++) {
// Do something
View row = listView.getChildAt(first);
}
Добавление
Теперь я хочу получить индекс всех элементов, которые полностью видимы
Я не уверен, что это означает. Если код, указанный выше, не является индексом, который вы хотели бы использовать:
int first = listView.getFirstVisiblePosition();
if(listView.getChildAt(0).getTop() < 0)
first++;
Чтобы иметь индекс, который относится к вашему адаптеру (т.е. adapter.getItem(first)
.)
Ответ 2
Как бы я это сделал, я бы расширил любое представление, которое вы передаете в getView
адаптера ListView
, и переопределите методы onAttachedToWindow
и onDetachedToWindow
, чтобы отслеживать видимые индексы.
Ответ 3
Попробуйте onScrollListner, и вы можете использовать getFirstVisiblePosition и getLastVisiblePosition.
Эта эта ссылка содержит аналогичную проблему. Полагаю, вы получили там свой ответ..,
Ответ 4
Вышеприведенный код несколько верен. Если вам нужно найти полностью видимое место просмотра, используйте ниже код
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
View v = null;
if (scrollState == 0) {
int first =0;
if (view.getChildAt(first).getTop() < 0)
first++;
int last = list.getChildCount() - 1;
if (list.getChildAt(last).getBottom() > list
.getHeight())
last--;
// Now loop through your rows
for ( ; first <= last; first++) {
// Do something
View row = view.getChildAt(first);
// postion for your row............
int i=list.getPositionForView(row);
}
}
// set the margin.
}