Android ListView完全滚动到顶部,同时使用clipToPadding =" false"

时间:2015-07-28 14:17:12

标签: android listview scroll

我有这个litle自定义ListView女巫实际上是一个' ListView'有一些回电。当我在启动Activity时动态更改填充(工具栏的高度),Items不响应填充,我必须滚动到顶部一些如何。

这是我的ListWiew。

<somesustom.cutom.ObservableListView
        android:id="@+id/listview"
        android:clipToPadding="false"
        android:theme="@style/ListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

所以问题是如何从代码中完全滚动到顶部?

所以我找到了解决方案

首先我从xml中删除了android:clipToPadding="false"。 然后我像我这样配置ObservableListView

public class ObservableListView extends ListView {


    private boolean clipPadding = true;

    public ObservableListView(Context context) {
        this(context, null, 0);
        setScrollListner();
    }

    public ObservableListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        setScrollListner();
    }

    public ObservableListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setScrollListner();
    }



    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if(clipPadding)   /// this is the trick, if clip to padding is true, then set selection 0
            setSelection(0);
    }

    public void setScrollListner()
    {
        clipPadding = true;

        super.setOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

                if(clipPadding && scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                    setClipToPadding(false);
                    clipPadding = false;  // if ii begin to scroll clipPadding 
                    // turns to false and onMeasure set selection not being called.
                }

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });
    }

}

如果我按钮点击更改填充,我不确定这种方法是否会起作用。但在我的情况下,我从ViewTreeObserver.OnGlobalLayoutListener设置填充,这非常有效。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下两种方法之一:

listview.smoothScrollToPosition(0);

listview.setSelection(0):