【发布时间】:2015-07-28 14:17:12
【问题描述】:
我有这个小自定义 ListView 女巫实际上是一个带有一些回调的“ListView”。当我在启动 Activity(工具栏的高度)时动态更改填充时,项目不响应填充,我必须以某种方式滚动到顶部。
这是我的 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 设置填充,这工作得很好。
【问题讨论】: