关于RecyclerView

关于RecyclerView,第1张

这篇毫无头绪,供个人查阅。

RecyclerView 必知必会

抽丝剥茧RecyclerView - 化整为零

RecyclerView的四大组成是:

Android中使用RecyclerView + SnapHelper实现类似ViewPager效果

让你明明白白的使用RecyclerView——SnapHelper详解

Android SnapHelper扒皮分析

SnapHelper硬核讲解

用RecyclerView做一个小清新的Gallery效果 ,之前项目中也做过卡片滑动,过程中缩放的功能。

>

用户引导滑动,到最后一张的时候,我认为理想的是同时具备以下两点:

1)用户可以点击上面的“开始使用”这样的按钮可以进入主界面;

2)用户接着滑动下一个的手势而进入主界面;

3)用户在引导界面点击返回键的时候直接进入主界面;

增加“开始使用”按钮方式:

可以定义一个layout的xml再加载:一个LinearLayout,里面一个button。默认button是“gone”,

xml如下:

<xml version="10" encoding="utf-8">

<LinearLayout xmlns:android=">

ViewPager2实际是内部的 RecyclerView 在起作用,所以ViewPager2一定要设置 RecyclerViewAdapter 赋值,并且Adapter的ItemView的布局必须为 match_parent 。才能正常使用。 ViewPager2+Fragment 提供了一个新的适配器 FragmentStateAdapter 。

FragmentStateAdapter实例

Activity中为Viewpager2初始化设置Adapter

以上就是ViewPager2的使用和属性设置,功能还是比较强大的,接下来看看Viewpager2的源码进行原理分析。

从ViewPager2的构造函数开始分析:

在ViewPager2的构造方法中都会调用 initialize 方法进行初始化,其中实例化了一个封装的RecyclerView,并为这个RecyclerView设置了 layoutManager、OnScrollListener监听、SnapHelper 。

ScrollEventAdapter 直译意思是:滑动事件适配器。类如其名,它的作用就是将RecyclerView的滑动事件 适配成ViewPager2的OnPageChangeCallback的事件

ScrollEventAdapter作为一个 RecyclerViewOnScrollListener 的实例类。在监听RecyclerView的滑动状态的两个方法 onScrollStateChanged、onScrolled 中,根据不同的状态调用 dispatchStateChanged、dispatchSelected、dispatchScrolled 设配成ViewPager2的页面滑动接口 OnPageChangeCallback 。

PageTransformerAdapter 是 ViewPager2OnPageChangeCallback 的实例类,作用是把 OnPageChangeCallbackonPageScrolled 的事件适配成 PageTransformertransformPage() 事件。

先看看 PageTransformerAdapter 在ViewPager2被调用的地方:

PageTransformerAdapter的作用就是为ViewPager2的PageTransformer,在页面滑动的时候转换成PageTransformer transformPage()。其中的transformPage(@NonNull View page, float position)方法的参数值可以参考这篇文章 PageTransformer详解 。ViewPager2如果想要实现页面之间的转换时动画可以重写 PageTransformer

FragmentStateAdapter 是谷歌为我们实现适配加载 Fragment 的 RecyclerViewAdapter ,如果我们想用ViewPager2加载Fragment页面,就可以继承 FragmentStateAdapter 作为适配器,只要重写其 构造方法 和 createFragment 、 getItemCount 。

这就是一个简易版的ViewPager2的FragmentAdapter。由此可见FragmentStateAdapter帮我们实现了Adapter的 onCreateViewHolder 、 onBindViewHolder 抽象方法。在 onCreateViewHolder 方法中创建了一个以 FrameLayout 为父类的View装载 Fragment 。

在重写的 onCreateViewHolder 方法中,通过 FragmentViewHoldercreate 创建一个以 FrameLayout 为父容器的ItemView。

在重写的 onBindViewHolder 方法中,1 先检测ItemView是否有加载过Fragment,如果加载过的Fragment与现在的Fragment不相同,则对ItemView和三个HashMap进行数据清空。2 对两个HashMap设置新的数据。 3 如果存在特殊情况,则当ItemView添加在到RecyclerView中才加载Fragment。

在ItemView依附在RecyclerView时,开始加载Fragment

具体能有多少个ItemView依附在RecyclerView中,取决于ViewPager2的缓存大小。

加载Fragment的流程在就在 placeFragmentInViewHolder 方法里,通过检查fragment和View的状态分别作出不同的 *** 作。

关于ViewPager2的源码浅析就讲完了,下面总结一下:

ScrollEventAdapter 的作用:是将 RecyclerView的滑动事件 转换成 ViewPager2的OnPageChangeCallBack 。

PageTransformerAdapter 的作用:是将 RecyclerView的滑动事件 转换成 ViewPager2的PageTransformer 。

FragmentStateAdapter 的作用:是为ViewPager2加载 Fragment提供基础的Adapter 。

Android中的ViewPager则实现了左右滑动的效果,ViewPager类提供了多界面切换的新效果。利用ViewPager实现循环滚动代码如下:

1、首先是布局文件,使用了一个ViewPager控件:       

      

<span style="padding: 0px; margin: 0px; font-size: 14px;"><RelativeLayout xmlns:android=";

2、接下来实现一个继承PagerAdapter的MyAdapter类,实现一个PagerAdapter,代码如下:

<span style="padding: 0px; margin: 0px; font-size: 14px;">package comexampleviewpagertest;

import javautilList;

import androidsupportv4viewPagerAdapter;

import androidviewView;

import androidviewViewGroup;

import androidwidgetImageView;

class ViewPagerAdapter extends PagerAdapter {

    private List<ImageView> mImageViewList;

    public ViewPagerAdapter(List<ImageView> imageViewList) {

        super();

        thismImageViewList = imageViewList;

    }

    /

      该方法将返回所包含的 Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,

      其实这并非是真正的无限循环。

     /

    @Override

    public int getCount() {

        return IntegerMAX_VALUE;

    }

         /

      判断出去的view是否等于进来的view 如果为true直接复用

     /

    @Override

    public boolean isViewFromObject(View arg0, Object arg1) {

        return arg0 == arg1;

    }

    /

      销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来,就是position,

      因为mImageViewList只有五条数据,而position将会取到很大的值,

      所以使用取余数的方法来获取每一条数据项。

     /

    @Override

    public void destroyItem(ViewGroup container, int position, Object object) {

        containerremoveView(mImageViewListget(position % mImageViewListsize()));

    }

    /

      创建一个view,

     /

    @Override

    public Object instantiateItem(ViewGroup container, int position) {

        containeraddView(mImageViewListget(position % mImageViewListsize()));

        return mImageViewListget(position % mImageViewListsize());

    }

}

</span>

3、最后是主界面部分的代码:

<span style="padding: 0px; margin: 0px; font-size: 14px;">package comexampleviewpagertest;

import javautilArrayList;

import javautilList;

import androidappActivity;

import androidosBundle;

import androidosHandler;

import androidosMessage;

import androidosSystemClock;

import androidsupportv4viewViewPager;

import androidsupportv4viewViewPagerOnPageChangeListener;

import androidviewView;

import androidwidgetImageView;

import androidwidgetLinearLayout;

import androidwidgetLinearLayoutLayoutParams;

import androidwidgetTextView;

public class MainActivity extends Activity implements OnPageChangeListener {

    private List<ImageView> imageViewList;

    private TextView tvDescription;

    private LinearLayout llPoints;

    private String[] imageDescriptions;

    private int previousSelectPosition = 0;

    private ViewPager mViewPager;

    private boolean isLoop = true;

    private Handler handler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            superhandleMessage(msg);

            mViewPagersetCurrentItem(mViewPagergetCurrentItem() + 1);

        }

    };

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        superonCreate(savedInstanceState);

        setView();

        initView();

    }

    public void setView() {

        setContentView(Rlayoutactivity_splash_viewpager);

        // 自动切换页面功能

        new Thread(new Runnable() {

            @Override

            public void run() {

                while (isLoop) {

                    SystemClocksleep(2000);

                    handlersendEmptyMessage(0);

                }

            }

        })start();

    }

    public void initView() {

        mViewPager = (ViewPager) findViewById(Ridviewpager);

        tvDescription = (TextView) findViewById(Ridtv_image_description);

        llPoints = (LinearLayout) findViewById(Ridll_points);

        

        prepareData();

        

        ViewPagerAdapter adapter = new ViewPagerAdapter(imageViewList);

        mViewPagersetAdapter(adapter);

        mViewPagersetOnPageChangeListener(this);

        

        tvDescriptionsetText(imageDescriptions[previousSelectPosition]);

        llPointsgetChildAt(previousSelectPosition)setEnabled(true);

        

        /

          2147483647 / 2 = 1073741820 - 1 

          设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动

         /

        int n = IntegerMAX_VALUE / 2 % imageViewListsize();

        int itemPosition = IntegerMAX_VALUE / 2 - n;

        

        mViewPagersetCurrentItem(itemPosition);

    }

    

     private void prepareData() {

            imageViewList = new ArrayList<ImageView>();

            int[] imageResIDs = getImageResIDs();

            imageDescriptions = getImageDescription();

            

            ImageView iv;

            View view;

            for (int i = 0; i < imageResIDslength; i++) {

                iv = new ImageView(this);

                ivsetBackgroundResource(imageResIDs[i]);

                imageViewListadd(iv);

                

                // 添加点view对象

                view = new View(this);

                viewsetBackgroundDrawable(getResources()getDrawable(Rdrawablepoint_background));

                LayoutParams lp = new LayoutParams(5, 5);

                lpleftMargin = 10;

                viewsetLayoutParams(lp);

                viewsetEnabled(false);

                llPointsaddView(view);

            }

        }

        

        private int[] getImageResIDs() {

            return new int[]{

                    Rdrawablebg1,

                    Rdrawablebg2,

                    Rdrawablebg3,

                    Rdrawablepic_01,

                    Rdrawablepic_02

            };

        }

        

        private String[] getImageDescription() {

            return new String[]{

                    "第一个引导页面",

                    "第二个引导页面",

                    "第三个引导页面",

                    "第四个引导页面",

                    "第五个引导页面"

            };

        }

        @Override

        public void onPageScrollStateChanged(int arg0) {

            

        }

        @Override

        public void onPageScrolled(int arg0, float arg1, int arg2) {

            

        }

        @Override

        public void onPageSelected(int position) {

            // 改变的描述信息

            tvDescriptionsetText(imageDescriptions[position % imageViewListsize()]);

            // 切换选中的点,把前一个点置为normal状态

            llPointsgetChildAt(previousSelectPosition)setEnabled(false);

            // 把当前选中的position对应的点置为enabled状态

            llPointsgetChildAt(position % imageViewListsize())setEnabled(true);

            previousSelectPosition = position  % imageViewListsize();

        }

    @Override

    protected void onDestroy() {

        superonDestroy();

        isLoop = false;

    }

}

</span>

以上就是关于关于RecyclerView全部的内容,包括:关于RecyclerView、android recyclerview怎么设置每次只能滑动一页、viewPager滑动到最后一张怎么进入下个页面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9482586.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存