RecyclerView的使用及配合CardView使用

                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多套布局显示

     @Override
public int getItemViewType(int position) {
    int type = position%2;
    return type;
}

@Override
public 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;
}

@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值