zoukankan      html  css  js  c++  java
  • (4)RecyclerVIew

    有关内容

    • Adapter
    • LayoutManager
    • itemDecoration
    • ItemAnimatorr
    • ItemTouchHelper

    了解RecyclerView

    • RecyclerView封装了viewholder的回收复用,编写Adapter面向的是ViewHolder而不再是View
    • 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对每一个Item的显示,RecyclerView专门抽取了相应的类,使其扩展性非常强。
    • 设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式。
    • 可设置Item的间隔样式(可绘制)。
    • 可以控制Item增删的动画。

    RecyclerView控件是Android 5.0,谷歌公司推出的,是support-v7包中的新组件,所以当我们要使用该控件时,首先需要在项目的build.gradle中添加相应的依赖库

    RecyclerView控件是Android 5.0,谷歌公司推出的,是support-v7包中的新组件,所以当我们要使用该控件时,首先需要在项目的build.gradle中添加相应的依赖库

    RecyclerView的相关类

    • RecyclerView.Adapter:可以托管数据集合,为每一项Item创建视图并且绑定数据
    • RecyclerView.ViewHolder:承载Item视图的子布局
    • RecyclerView.LayoutManager:负责Item视图的布局的显示管理
    • RecyclerView.ItemDecoration:画分割线
    • RecyclerView.ItemAnimator:负责处理数据添加或者删除时候的动画效果

    RecyclerView的基本使用步骤

    • 获取RecyclerView控件
    RecyclerView  recyclerView  = ( RecyclerView) findViewById(R.id.xxx)
    
    • 给获取的RecyclerView设置布局管理器
    • 创建并设置自定义适配器
    • 将RecyclerView与自定义的适配器的对象绑定

    Adapter

    • 创建View和ViewHolder,后者作为整个复用机制的跟踪单元。
    • 把具体位置的Item和ViewHolder进行绑定,并存储相关的信息。
    • 通知RecyclerView数据变化,支持局部的更新,在提高效率的同同时也有效的支持动画。
    • Item点击事件的处理。
    • 多类型布局的支持。

    自定义适配器

    • 继承于RecyclerView.Adapter
    • 构造函数

    初始我们想要展示的数据

    • 创建内部类ViewHolder(View view)继承于RecyclerView.Adapter
      这个内部类用来获取RecyclerView中每个Item的布局以及和它相关联的数据,同时也是RecyclerView.Adapter中需要指定的VH类型
    • 实现抽象方法
      • onCreateViewHolder(ViewGroup parent, int viewType)

    当RecyclerView需要我们提供类型为viewType的新ViewHolder时,会回调这个方法。
    在这里,我们实例化出了Item的根布局,并返回一个和它绑定的ViewHolder。
    - onBindViewHolder(VH viewHolder, int position)
    当RecyclerView需要展示对应position位置的数据时会回调这个方法。
    通过viewHolder中持有的对应position上的View,我们可以更新视图。
    - getItemCount()
    返回Item的总数。

    LayoutMannager

    • Position:负责view的摆放,线性、宫格、瀑布流式或者任意类型
    • Scroll:处理滚动事件,RecyclerView负责接收事件,最终由LayoutManage处理滚动后的逻辑,因为只有它知道View的具体摆放位置。

    三种布局管理器

    • 线性布局,横向或者纵向滑动列表
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
         recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
    
    • 表格布局
    GridLayoutManager layoutManager=new GridLayoutManager(this,4);
    
    • 瀑流式布局
    StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
    

    RecyclerView的点击事件

    先获取点击的数据元素的postion,再通过position获取被点击的Fruit的实例,然后通过toast显示被点击的实例的内容。

    自定义REcyclerView的Item间分割线

    • 通过方法引入addItemDecoration方法就可以画出默认分割线
    • 如果要画出自定义分割线,就要在drawable下新建一个xml文件,然后在values文件下styles.xml文件中用之前新建的xml文件替换RecyclerView自带的listDivider
    • 自定义ItemDecoration.

    数据更新

    • 数据更新分为两种
        • 除了Item所对应的数据被更新外,没有其他变化使用, notifyXXXChanged()。
        • 位置变化:Item在数据集中被插入、删除或者移动,使用notifyXXXInsert/Removed/Moved()方法。
    • 局部的刷新
    notifyItemChanged(int postion) //position的数据变化 一条数据 
    notifyItemInserted(int position) //在position的下方插入了一条数据
    notifyItemRemoved(int postion) //移除了position的数据 
    notifyItemRangeChanged(int postion, int n) //从position开始,往下n条数据发生了改变 notifyItemRangeInserted(int position, int n) //从position开始,插入了n条数据 notifyItemRangeRemoved(int postion, int n) //从position开始,移除了n条数据
    
    • 整体刷新

    notifyDataSetChanged()会吧当前所有的Item和结构都视为已经失效的,因此它会让LayoutManager重新绑定Item,并对它们重新布局。

    ItemAnimator动画

    • RecyclerView提供了默认的ItemAnimator实现类:DefaultitemAnimator如果没有特殊的需求,默认使用这个动画即可。
    mRecyclerView.setItemAnimator(new DefaultitemAnimator());
    
    • RecyclerView的Item增添删除
      • 在Adapter里面添加方法实现相应逻辑:list数组的add/remove方法的调用;
        界面的刷新
    addItem(int position)   //在position下面增添一个Item
         removeItem(int position)//删除position的Item
    
    • 相应的点击事件
  • 相关阅读:
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    linux下导入、导出mysql数据库命令
    8个必备的PHP功能开发
    jquery中的children()和contents()的区别
    centos 通用开发工具及库安装 有了它不用愁了
    将bat批处理文件注册成windows服务
    squid隐藏squid的版本号
    squid如何屏蔽User-Agent为空的请求
    RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  • 原文地址:https://www.cnblogs.com/lyszyl/p/10654578.html
Copyright © 2011-2022 走看看