RecyclerView和CardView的使用

        前言:Material Design Library系列博客写完后总觉得缺少了点什么,后来一想RecyclerView和CardView虽然是android-suport-v7-21中添加的,但也是Material Design不可或缺的一部分,所以在这篇博客中结合SwipeRefreshLayout实现一个下拉刷新的Demo做个笔记。

       接下来实现的效果是这样的:

       通过下拉刷新增加item

       

1.新建工程并添加依赖:

    compile 'com.android.support:recyclerview-v7:23.4.0'
    compile 'com.android.support:cardview-v7:23.4.0'

2.新建一个布局recycler_item.xml作为RecyclerView的每个item,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_card_view"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_margin="4dp"
    app:cardBackgroundColor="#AABBCC"
    app:cardCornerRadius="8dp"
    android:elevation="2dp">

    <TextView
        android:id="@+id/id_item_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:layout_gravity="center"/>

</android.support.v7.widget.CardView>

这里只是在CardView下简单放置了一个TextView。

CardView下有三个重要的属性:

        cardBackgroundColor用来设置卡片的背景颜色

        cardCornerRadius用来设置卡片的四个圆角尺寸

        elevation用来设置卡片在Z轴上的悬浮尺寸

3.修改activity_main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/id_swipe_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/id_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"/>

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

这里用SwipeRefreshLayout将RecyclerView包裹住,需要注意的是SwipeRefreshLayout下只能有一个直接子View。

4.新建一个适配器类MyRecyclerAdapter用于RecyclerView的数据适配,代码如下:

    class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {

        private LayoutInflater inflater;

        public MyRecyclerAdapter(Context context) {
            inflater = LayoutInflater.from(context);
            mItemNum = 5;
            mItemDatas = new ArrayList<String>();
            for (int i=0; i<mItemNum; i++) {
                mItemDatas.add(i, "item" + (i+1));
            }
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = inflater.inflate(R.layout.recycler_item, parent, false);
            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.itemTv.setText(mItemDatas.get(position));
        }

        @Override
        public int getItemCount() {
            return mItemDatas.size();
        }

        //自定义的ViewHolder,持有每个Item的所有界面元素
        public class ViewHolder extends RecyclerView.ViewHolder {
            public CardView itemCV;
            public TextView itemTv;

            public ViewHolder(View view) {
                super(view);
                itemCV = (CardView) view.findViewById(R.id.id_card_view);
                itemTv = (TextView) view.findViewById(R.id.id_item_tv);
            }
        }
    }

可以看到MyRecyclerView类重写了三个方法:

       onCreateViewHolder() => inflater出每个item的view,返回一个包含了具体view的ViewHolder

       onBindViewHolder() => 该方法通过接收ViewHolder和position这两个参数来确定是RecyclerView中的哪个item,然后将data与ViewHolder进行绑定,此时的ViewHolder已经是一个具有View和data的完整对象了

       getItemCount() => 顾名思义,获取item的数目

5.在onCreate()方法中加入RecyclerView部分的代码,如下:

        mRecyclerView = (RecyclerView) findViewById(R.id.id_recycler_view);
        //设置固定大小
        mRecyclerView.setHasFixedSize(true);
        //创建线性布局
        mRecyclerLayoutManager = new LinearLayoutManager(this);
        //垂直方向
        mRecyclerLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        //给RecyclerView设置布局管理器
        mRecyclerView.setLayoutManager(mRecyclerLayoutManager);
        //创建适配器
        mAdapter = new MyRecyclerAdapter(this);
        mRecyclerView.setAdapter(mAdapter);

RecyclerView的使用主要分为三步:获取实例 -> 设置LayoutManager -> 添加适配器


/**----------到了这里RecyclerView的使用其实已经完成了,接下来的代码主要是为了增加对下拉刷新的支持!---------*/

6.在onCreate()方法中加入SwipeRefreshLayout的设置监听代码:

        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.id_swipe_refresh);
        swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        mItemDatas.add(mItemNum, "item" + (mItemNum+1));
                        mItemNum++;

                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        mHandler.sendEmptyMessage(0);
                    }
                }).start();
            }
        });

7.添加handler处理部分代码:

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            swipeRefreshLayout.setRefreshing(false);
            mAdapter.notifyDataSetChanged();
        }
    };

SwipeRefreshLayout下主要有5个方法:

       setOnRefreshListener() => 设置手势滑动监听器

       setProgressBackgroundColor() => 设置进度圈的背景颜色

       setColorSchemeResources() => 设置进度动画的颜色

       setRefreshing() => 设置组件是否在刷新,一般在刷新完成后设置为false

       setSize() => 设置进度圈的大小,只有两个值:DEFAULT、LARGE


源码地址:http://download.csdn.net/detail/chenhao0428/9567747


想全面完整地学习Material Design可以参考这里:http://www.mobileui.cn/material-design/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值