Подтвердить что ты не робот

Получить все видимые объекты на lListView

У меня есть ListView, который содержит больше элементов, которые я могу отобразить за один раз. Теперь я хочу, чтобы индекс был отключен от всех элементов, которые полностью видимы (- > исключая те, которые только частично видны). В этот момент я использую getFirstVisiblePosition() и getLastVisiblePosition() в for-loop для их итерации, но этот метод не является точным, как я хочу.

Есть ли лучшее решение?

4b9b3361

Ответ 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.
}