美文网首页Android专题Android控件使用篇
全面解析:SnapHelper用法、原理,含演示效果对比+实现代

全面解析:SnapHelper用法、原理,含演示效果对比+实现代

作者: 千夜零一 | 来源:发表于2020-11-04 12:09 被阅读0次

    介绍

      SnapHelper 是在 Android 24.2.0 的support 包中新添加的一个支持库,是对RecyclerView的拓展。SnapHelper旨在支持RecyclerView的对齐方式,通过计算对齐RecyclerView中TargetView 的指定点或者容器中的任何像素点,可以使RecyclerView实现类似于 ViewPager 的切换效果。
      SnapHelper是对RecyclerView的一种拓展功能,支持snapping。SnapHelper通过处理RecyclerView的fling,来达到要展示的效果。


    SnapHelper

    • 用法:与RecyclerView配合使用,绑定到RecyclerView控件上生效。
    • 实现原理:监听RecyclerView.OnFlingListener中的onFling接口。
    • 具体实现:LinearSnapHelper、PagerSnapHelper。

    LinearSnapHelper:

      作用:LinearSnapHelper,可滑动多页,居中显示。

    LinearSnapHelper mLinearSnapHelper = new LinearSnapHelper();
    mLinearSnapHelper.attachToRecyclerView(mRecyclerview);
    

    PagerSnapHelper:

      作用:每次只能滑动一页,居中显示。

    PagerSnapHelper mPagerSnapHelper = new PagerSnapHelper();
    mPagerSnapHelper.attachToRecyclerView(mRecyclerview);
    

    效果对比

    LinearSnapHelper.gif
    PagerSnapHelper.gif

    Java语言中使用SnapHelper

    • 使用:LinearSnapHelper
    BannerRecyclerAdapter adapter = new BannerRecyclerAdapter(mList);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(RecyclerView.HORIZONTAL);
    banner_rv.setLayoutManager(layoutManager);
    banner_rv.setAdapter(adapter);
    LinearSnapHelper snapHelper = new LinearSnapHelper(); 
    snapHelper.attachToRecyclerView(banner_rv);
    
    • 使用:PagerSnapHelper
    ……
    LinearSnapHelper snapHelper = new PagerSnapHelper(); 
    snapHelper.attachToRecyclerView(banner_rv);
    

    Kotlin语言中使用SnapHelper

    • 使用:LinearSnapHelper
    val layoutManager = LinearLayoutManager(mContext)
    layoutManager.orientation = LinearLayoutManager.HORIZONTAL
    banner_rv.layoutManager = layoutManager
    banner_rv.adapter = BannerRecyclerAdapter(mContext, dataList)
    val snapHelper: SnapHelper = LinearSnapHelper()
    //解决RecyclerView中用SnapHelper抛出异常:java.lang.IllegalStateException: An instance of OnFlingListener already set.(当Adapter中有多个ViewType时可能发生)
    snapHelper.attachToRecyclerView(banner_rv)
    
    • 使用:PagerSnapHelper
    ……
    val snapHelper: SnapHelper = PagerSnapHelper()
    //解决RecyclerView中用SnapHelper抛出异常:java.lang.IllegalStateException: An instance of OnFlingListener already set.(当Adapter中有多个ViewType时可能发生)
    snapHelper.attachToRecyclerView(banner_rv)
    

    Tips:
      此外,在RecyclerViewAdapter中具备多个ViewType时,可能会遇到抛出异常问题:java.lang.IllegalStateException: An instance of OnFlingListener already set.(当Adapter中有多个ViewType时可能发生)。
      具体解决方法:参照我的另一篇博客:完美解决:RecyclerViwe中使用SnapHelper报错:“An instance of OnFlingListener already set.”
      应评论区“无相孤君”同学的要求,大家可以传送去看看我的这篇博客用ViewPager实现轮播图:图片无限轮播+动态切换+小圆点切换+透明标题

    大功告成!

    相关文章

      网友评论

        本文标题:全面解析:SnapHelper用法、原理,含演示效果对比+实现代

        本文链接:https://www.haomeiwen.com/subject/egfgvktx.html