实现场景:点击置顶按钮,滑动到第一条
解决问题:第一条显示不全问题
1、按钮监听
if (i == R.id.go_top) {
shopGoodListRecycler.smoothScrollToPosition(0);
isSmoothToTop = true;
}
2、recyclerview监听
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (isSmoothToTop) {
//解决item=0显示不全问题(异常:图片上面还有文字,正常:图片在最上面)
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
if (firstVisibleItemPosition == 0) {
int top = recyclerView.getChildAt(0).getTop();
if (top < 0) {
//第二次滚动(最后的300米!)
recyclerView.smoothScrollBy(0, top);
}
}
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (!isRefreshing && newState == RecyclerView.SCROLL_STATE_IDLE
&& mAdapter.isHasMore()
&& mLlm.findLastVisibleItemPosition() >= mData.size() - 1) {
loadMore();
}
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
// 当不滚动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// 判断是否滚动超过一个item
if (firstVisibleItemPosition == 0) {
go_top.setVisibility(View.INVISIBLE);
isSmoothToTop = false;
} else {
go_top.setVisibility(View.VISIBLE);
}
} else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {//拖动中
go_top.setVisibility(View.INVISIBLE);
}
}
});
3、注意isSmoothToTop=false的位置
注意重新取recyclerview的布局管理者
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
4、不能在onScrollStateChanged的不滚动状态做,会有卡顿现象
5、拓展:带smooth字样的是具有滑动效果
smoothScrollToPosition(0)具有滑动效果
scrollToPosition(0)没有滑动效果
recyclerView.