RecyclerView的使用及配合CardView使用

来源:互联网 发布:linux下shell脚本编程 编辑:程序博客网 时间:2024/06/05 10:56
                RecyclerView

概述

RecyclerView出现已经有一段时间了,大家可以通过导入support-v7对其进行使用。 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。你想要控制其显示的方式,请通过布局管理器LayoutManager你想要控制Item间的间隔(可绘制),请通过ItemDecoration你想要控制Item增删的动画,请通过ItemAnimator你想要控制点击、长按事件,请自己写

了解

LayoutManager
ItemDecoration
ItemAnimator
RecyclerView.Adapter

一 使用

使用1:    RecyclerView配合LinearLayoutManager使用!显示ListView效果    目的:了解RecyclerView使用! 了解RecyclerView.Adapter使用! 了解自定义ViewHolder 继承RecyclerView包下的ViewHolder    步骤:         1.初始化控件         2.设置LayoutManager            /*               参数1:上下文对象               参数2:排列方向               参数3:数据是否反向显示             */            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true);            recyclerView.setLayoutManager(linearLayoutManager);        3.创建设置Adapter            class MyRecyclerViewAdapter extends  RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHoler>{            @Override            public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType)            @Override            public void onBindViewHolder(MyViewHoler holder, int position) {            @Override            public int getItemCount() {         class MyViewHoler extends RecyclerView.ViewHolder{          private TextView textView;          public MyViewHoler(View itemView) {            super(itemView);            textView = (TextView) itemView.findViewById(R.id.activity_recyclerView_item_textId);        4.设置Adapter即可使用2:    RecyclerView配合GridLayoutManager使用!显示GridView效果    LayoutManager使用 GridLayoutManager使用3:     RecyclerView配合StaggeredGridLayoutManager使用!显示瀑布流效果    LayoutManager使用 StaggeredGridLayoutManager    注意事项:       使用StaggeredGridLayoutManager显示瀑布流效果!需要在Adapter的onBindViewHolder方法 自己制定控件的宽和高

二 RecyclerView点击事件

    RecyclerView自身不能相ListView和GridView一样 有Item点击事件!需要自己手动添加点击事件!一下就是添加点击事件的流程!    1.onBindViewHolder方法中给控件设置监听事件!    2.使用Adapter对应的Activity传递监听事件        传递方法:1.Adapter的构造方法传递!  必须实现                   2.通过set方法传递!比较灵活,可以根绝自行调用决定!       注意:设置控件的单机事件和长按事件是有冲突的!如果长按事件返回值false 那么也会触发单击事件!如果返回ture那么!不会触发单击事件!

三 RecyclerView 配合CardView使用

 CardView特殊属性     这个FrameLayout特殊点就是有rounded corner(圆角)和shadow(阴影),这个就是它的特殊之处,回首往日,我们需要自定义shape文件进行实现圆角和阴影的设计,现在google的大牛已经把它设计为CardView的属性供我们设置进行使用。下面我们看看CardView新增了哪些属性:        <resources>  <declare-styleable name="CardView">    <!-- Background color for CardView. -->    <!-- 背景色 -->    <attr name="cardBackgroundColor" format="color" />    <!-- Corner radius for CardView. -->    <!-- 边缘弧度数 -->    <attr name="cardCornerRadius" format="dimension" />    <!-- Elevation for CardView. -->    <!-- 高度 -->    <attr name="cardElevation" format="dimension" />    <!-- Maximum Elevation for CardView. -->    <!-- 最大高度 -->    <attr name="cardMaxElevation" format="dimension" />    <!-- Add padding in API v21+ as well to have the same measurements with previous versions. -->    <!-- 设置内边距,v21+的版本和之前的版本仍旧具有一样的计算方式 -->    <attr name="cardUseCompatPadding" format="boolean" />    <!-- Add padding to CardView on v20 and before to prevent intersections between the Card content and rounded corners. -->    <!-- 在v20和之前的版本中添加内边距,这个属性是为了防止卡片内容和边角的重叠 -->    <attr name="cardPreventCornerOverlap" format="boolean" />    <!-- 下面是卡片边界距离内部的距离-->    <!-- Inner padding between the edges of the Card and children of the CardView. -->    <attr name="contentPadding" format="dimension" />    <!-- Inner padding between the left edge of the Card and children of the CardView. -->    <attr name="contentPaddingLeft" format="dimension" />    <!-- Inner padding between the right edge of the Card and children of the CardView. -->    <attr name="contentPaddingRight" format="dimension" />    <!-- Inner padding between the top edge of the Card and children of the CardView. -->    <attr name="contentPaddingTop" format="dimension" />    <!-- Inner padding between the bottom edge of the Card and children of the CardView. -->    <attr name="contentPaddingBottom" format="dimension" />    </declare-styleable>  </resources>   CardView5.0手机不能直接使用 需要在外层嵌套一层布局  添加Margin属性   或者使用cardUseCompatPadding = true

四 RecyclerView多套布局显示

     @Overridepublic int getItemViewType(int position) {    int type = position%2;    return type;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    RecyclerView.ViewHolder holder=null;    LayoutInflater from = LayoutInflater.from(context);    if (viewType == 0){        View view = from.inflate(R.layout.item_layout_one, parent, false);        holder= new OneViewHolder(view);    }else if (viewType == 1){        View view = from.inflate(R.layout.item_layout_two, parent, false);        holder = new TwoViewHolder(view);    }    return holder;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {    int itemViewType = getItemViewType(position);    switch (itemViewType) {        case 0:            OneViewHolder oneViewHolder = (OneViewHolder) holder;            oneViewHolder.textView.setText("类型是0的数据"+data.get(position));        break;        case 1:            TwoViewHolder twoViewHolder = (TwoViewHolder) holder;            twoViewHolder.textView.setText("类型是1的数据"+data.get(position));        break;    }

五 RecyclerView下拉刷新上拉加载更多

 RecyclerView下拉刷新 需要配个SwipRefreshLayout进行 SwipRefreshLayout常用属性和方法     1、setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener):设置手势滑动监听器。     2、setProgressBackgroundColor(int colorRes):设置进度圈的背景色。     3、setColorSchemeResources(int… colorResIds):设置进度动画的颜色。     4、setRefreshing(Boolean refreshing):设置组件的刷洗状态。     5、setSize(int size):设置进度圈的大小,只有两个值:DEFAULT、LARGE      6. setProgressViewOffset() 设置swipRefreshLayout小圆圈的偏移量
0 0