首先来看一下设计图,看到这个图其实我相信很多人直接就想到用ViewPager,用ViewPager绝对没问题,可是我比较懒,总觉得这个用ViewPager做不够轻量,于是乎百度,发现RecyclerView有一个辅助类PagerSnapHelper可以实现这种功能,于是乎试了一下,可是好像做下来也并没有我想的那么比ViewPager轻量,废话不多说了,记录一下,请大神多多指正。
主要是利用PagerSnapHelper的功能实现,代码如下:
final PagerSnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
View viewIdle = snapHelper.findSnapView(linearLayoutManager);
if (viewIdle != null) {
int position = linearLayoutManager.getPosition(viewIdle);
updateIndicators(position);
}
break;
}
}
});
adapter = new RecyclerViewAdapter();
recyclerView.setAdapter(adapter);
RecyclerView本身的写发不变,只是这里这一点儿就能实现了,够简单了也是,可是有一个,有一些机型会把第二页的内容也显示到第一页,原因是有的机型会不加载itemView的顶层布局,所以顶层布局的match_parent不起作用,所以应该在adapter中给itemView动态设置宽度
public class ViewHolder extends RecyclerView.ViewHolder { private TextView textView; public ViewHolder(@NonNull View itemView) { super(itemView); float[] size = getDeviceDisplaySize(getContext()); itemView.setMinimumWidth((int) size[0]); textView = itemView.findViewById(R.id.textView); } }
因为我这里的是公告,childView只是一个可以上下滑动的TextView,这样就有了不同方向的滑动冲突,可以使用外部拦截的办法处理滑动冲突,自定义RecyclerView重写onInterceptTouchEvent 做下处理,代码如下:
@Override public boolean onInterceptTouchEvent(MotionEvent event) { switch (event.getAction()) { case