18

一度に表示できるより多くの要素を含むListViewがあります。今、完全に表示されているすべての要素からインデックスを取得したいと思います(->部分的にしか表示されていない要素を除く)。現時点ではgetFirstVisiblePosition()&getLastVisiblePosition()を使用しfor-loopてそれらを繰り返しますが、これらの方法は私が望むほど正確ではありません。

より良い解決策はありますか?

4

4 に答える 4

30

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).)

于 2012-11-01T16:28:21.990 に答える
1

onScrollListner を試すと、getFirstVisiblePosition と getLastVisiblePosition を使用できるようになります。

このリンクには、同様のタイプの問題が含まれています私はあなたがそこにあなたの答えを得たと思います..,.

于 2012-11-01T18:15:57.947 に答える
1

私がこれを行う方法getViewは、アダプターに渡されているビューを拡張し、メソッドをListViewオーバーライドして、表示されているインデックスを追跡することです。onAttachedToWindowonDetachedToWindow

于 2012-11-01T16:45:41.310 に答える