前言
在日常开发中,我们经常会遇到选择事物的需求,例如单选多选,会让我们记住选中的状态下次进入默认选中并滑动到该位置 并把它置顶操作,今天正好遇到了这个需求 ,记录下线性布局与网格布局的使用
一、使用步骤
1.LinearLayoutManager
代码如下(示例):
public static class StickyTopLinearLayoutManager extends LinearLayoutManager {
private Context mContext;
public StickyTopLinearLayoutManager(Context context) {
super(context);
mContext = context;
}
public StickyTopLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public StickyTopLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
StickyTopicScroller stickyTopicScroller = new StickyTopicScroller(mContext);
stickyTopicScroller.setTargetPosition(position);
startSmoothScroll(stickyTopicScroller);
}
}
2.GridLayoutManager
代码如下(示例):
public static class StickyTopGridLayoutManager extends GridLayoutManager {
private Context mContext;
public StickyTopGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public StickyTopGridLayoutManager(Context context, int spanCount) {
super(context, spanCount);
mContext = context;
}
public StickyTopGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
super.smoothScrollToPosition(recyclerView, state, position);
StickyTopicScroller stickyTopicScroller = new StickyTopicScroller(mContext);
stickyTopicScroller.setTargetPosition(position);
startSmoothScroll(stickyTopicScroller);
}
}
3.LinearSmoothScroller
代码如下(示例):
public static class StickyTopicScroller extends LinearSmoothScroller {
public StickyTopicScroller(Context context) {
super(context);
}
@Override
public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
//原本的返回值
//return super.calculateDtToFit(viewStart, viewEnd, boxStart, boxEnd, snapPreference);
//修改,返回item置顶的偏移量如果是二级列表即有标题或头部加上对应的值就可把头部显示出来
return boxStart - viewStart;
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return super.calculateSpeedPerPixel(displayMetrics);
}
}
4.使用
代码如下(示例):
// 给recyclerView设置我们重写的StickyTopicItemLayoutManager
mRecyclerView.setLayoutManager(new StickyTopLinearLayoutManager(activity));//线性布局
mRecyclerView.setLayoutManager(new StickyTopGridLayoutManager(activity, 5));//网格布局
//调用平滑滚动即可实现我们想要的置顶
mRecyclerView.smoothScrollToPosition(chooseTypePoi);
总结
以上就是今天要讲线性列表、网格列表实现滑动到指定位置并置顶的内容,简单实用。