我想确定我的 Gridview 是否滚动到顶部。
现在我正在使用 getChildAt(0).getTop() 来做到这一点。我在第一次绘制时保存 getChildAt(0).getTop() 的值,并在后续绘制时与 getChildAt(0).getTop() 进行比较。
但是,这似乎很老套,有时似乎会给我不正确的结果。
有更好的想法吗?
我想确定我的 Gridview 是否滚动到顶部。
现在我正在使用 getChildAt(0).getTop() 来做到这一点。我在第一次绘制时保存 getChildAt(0).getTop() 的值,并在后续绘制时与 getChildAt(0).getTop() 进行比较。
但是,这似乎很老套,有时似乎会给我不正确的结果。
有更好的想法吗?
尝试使用onScrollListener
setOnScrollListener(this);
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem == 0){
//do stuff here
}
}
返回给您 GridView的getChildAt(0)
第一个可见项目,我猜这不是您想要的。
如果您使用yourGridView.getFirstVisiblePosition()
方法,它将返回您的数据适配器的第一个可见位置,这就是您想要的。
希望这可以帮助,它对我有用,祝你好运。
yourGridView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(SCROLL_STATE_IDLE == scrollState) {
View view = view.getChildAt(0);
if(view != null) {
float y = view.getY();
Log.d("Tag", "first view Y is " + y);
if(y == 0) {
// do what you want
}
}
}
}
这是我的回答:
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mListRV= (RecyclerView).findViewById(R.id.list_rv);
mListRV.setLayoutManager(mLayoutManager);
mListRV.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
View v = mLayoutManager.getChildAt(0);
int offsetTop = v.getTop();
int offsetBottom = v.getBottom();
int height = (offsetBottom - offsetTop);
if(offsetTop >= -height/2) {
mListRV.smoothScrollBy(0, offsetTop);
} else {
mListRV.smoothScrollBy(0, height + offsetTop);
}
}
}
});