使用RecyclerView做类似ViewPager的效果实现app翻页公告

本文介绍了如何使用RecyclerView的PagerSnapHelper辅助类来创建类似ViewPager的翻页效果,以实现轻量级的app公告功能。在处理上下滑动冲突时,通过自定义RecyclerView并重写onInterceptTouchEvent来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先来看一下设计图,看到这个图其实我相信很多人直接就想到用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 
介绍:一个基于RecyclerView实现ViewPager,支持类似于gallary的fling操作。点击上面"下载源码" 按钮,可以下载完整的demo。其中recyclerview是android-support中的依赖项目,RecyclerViewPager是主项目。运行效果使用说明:继承自 RecyclerView.自定义 fling factor.自定义 paging trigger.支持 水平个垂直方向.支持 FragmentViewPager (api 12 )gradlecompile('com.lsjwzh:recyclerviewpager:1.0.2')xml:java:final RecyclerViewPager mRecyclerView = (RecyclerViewPager) this.findViewById(R.id.recyclerViewPager); LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);//LinearLayoutManager.HORIZONTAL 设置水平滚动 mRecyclerView.setLayoutManager(layout); //set adapter mRecyclerView.setAdapter(new MyRecyclerAdapter());static class MyRecyclerAdapter extends RecyclerView.Adapter { private List items = new ArrayList(); public MyRecyclerAdapter(){ //创建4个页面 for(int i = 1; i<5; i ){ items.add("页面" i); } } public static class ViewHolder extends RecyclerView.ViewHolder{ public ViewHolder(View itemView) { super(itemView); } } @Override public int getItemCount() { // TODO Auto-generated method stub return items.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { String item = items.get(position); TextView msgTv = (TextView)holder.itemView.findViewById(R.id.msg); msgTv.setText(item); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(inflate == null) inflate = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = (LinearLayout)(inflate.inflate(R.layout.item, null)); return new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值