web-dev-qa-db-ja.com

Androidリストビュー?

Androidリストビュー内の特定のアイテムが完全に表示されていることを確認する方法はありますか?

たとえばボタンを押したときのように、プログラムで特定のアイテムにスクロールできるようにしたいと思います。

25

ListView.setSelection() は、目的のアイテムがビューポート内にあるようにリストをスクロールします。

20
Christopher Orr

それを試してみてください:

public static void ensureVisible(ListView listView, int pos)
{
    if (listView == null)
    {
        return;
    }

    if(pos < 0 || pos >= listView.getCount())
    {
        return;
    }

    int first = listView.getFirstVisiblePosition();
    int last = listView.getLastVisiblePosition();

    if (pos < first)
    {
        listView.setSelection(pos);
        return;
    }

    if (pos >= last)
    {
        listView.setSelection(1 + pos - (last - first));
        return;
    }
}
11
jauseg

私はあなたが探しているのは ListView.setSelectionFromTop() だと思います(私はパーティーに少し遅れていますが)。

5
Jonas Rabbe

最近、同じ問題が発生しました。誰かが必要とする場合に備えて、ここに解決策を貼り付けてください(最後に表示されているアイテム全体を表示しようとしていました)。

    if (mListView != null) {
        int firstVisible = mListView.getFirstVisiblePosition()
                - mListView.getHeaderViewsCount();
        int lastVisible = mListView.getLastVisiblePosition()
                - mListView.getHeaderViewsCount();

        View child = mListView.getChildAt(lastVisible
                - firstVisible);
        int offset = child.getTop() + child.getMeasuredHeight()
                - mListView.getMeasuredHeight();
        if (offset > 0) {
            mListView.smoothScrollBy(offset, 200);
        }
    }
3
liuyong

私はこれを行うためのより短い、そして私の意見ではより良い解決策を持っています:ListViewrequestChildRectangleOnScreenメソッドはそれのために設計されています。

上記の答えは、アイテムが表示されることを保証しますが、部分的に表示される場合もあります(つまり、画面の下部にある場合)。以下のコードは、アイテム全体が表示され、ビューが必要なゾーンのみをスクロールすることを保証します。

    private void ensureVisible(ListView parent, View view) {
    Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
    parent.requestChildRectangleOnScreen(view, rect, false);
}
2
Yves Delerm