0

我有ListView一些复选框和一个页脚,我必须在检查其中一个复选框时显示。

我想要实现的是,如果我单击将被此页脚重叠的项目,则会ListView自动滚动以显示该项目。请注意,ListView放置正确,可以进一步滚动。

我已经在 onItemClicked 函数中尝试过,但到目前为止还没有奏效:

if (mFooterView.getVisibility() != View.VISIBLE) {
    mFooterView.setVisibility(View.VISIBLE);

    mImagesListView.smoothScrollToPosition(position);
}

问题似乎是 smoothScrollToPosition 使用当前测量值,该测量值被mFooterView.setVisibility(View.VISIBLE). 然而,新的测量值似乎要到下一次重绘才可用。

无论如何我可以达到这个效果吗?非常感谢。

4

1 回答 1

0

在检查了ListView一段时间的源代码后,我设法从ListView.onSizeChanged(). 关键是在 ListView 实际调整大小后进行滚动。我们可以通过使用post函数来做到这一点。

这是代码(注意它不会滚动,只是设置正确的位置,但你明白了):

public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

    if (mFooterView.getVisibility() == View.GONE) {
        mFooterView.setVisibility(View.VISIBLE);

        // at this point, the listview's height hasn't changed yet
        int listOldHeight = parent.getHeight();

        if (mItemAutoVisibilityScroller == null) {
            mItemAutoVisibilityScroller = new ItemAutoVisibilityScroller();
        }

        // allow the list to resize
        mFooterView.post(mItemAutoVisibilityScroller.setup(listOldHeight, position, view.getTop(), view.getHeight()));
    } else {
        mFooterView.setVisibility(View.GONE);
    }
}

private class ItemAutoVisibilityScroller implements Runnable {
    private int mListOldHeight;
    private int mPosition;
    private int mItemTop;
    private int mItemHeight;

    public ItemAutoVisibilityScroller setup(int listOldHeight, int position, int itemTop, int itemHeight) {
        mListOldHeight = listOldHeight;
        mPosition = position;
        mItemTop = itemTop;
        mItemHeight = itemHeight;
        return this;
    }

    public void run() {
        final int textTop = mFooterView.getTop();

        // is the item cut by the footer?
        if (mItemTop + mItemHeight > textTop) {

            int newItemTop = mListOldHeight - mFooterView.getHeight() - mItemHeight;
            if (newItemTop < 0) {
                newItemTop = 0;
            }

            // move the item just above the footer
            mListView.setSelectionFromTop(mPosition, newItemTop);
        }
    }
}
于 2013-02-19T22:42:36.653 回答