RecyclerView和CardView的使用以及注意

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013200308/article/details/51244289

转载请注明出处
作者:AboutJoke ( http://blog.csdn.net/u013200308 )
原文链接:http://blog.csdn.net/u013200308/article/details/51244289

距离RecyclerView和CardView的出现已经很久了,网上也有很多关于这方面的博客。因为最近自己在项目中用到了Material Design设计规范,所以才第一次接触到了RecyclerView和CardView。在这篇博客中,我将给大家介绍一下RecyclerView和CardView的使用方法以及在使用过程中可能遇到的一些问题。具体的实现将通过一个Demo来进行介绍。

RecyclerView和CardView的简单介绍

2014年,随着Google推出了全新的设计语言Material Design,还迎来了新的Android支持库v7,其中就包含了RecyclerView和CardView。可在路径sdk\extras\android\support\v7下找到相关的support包,通过导入来进行依赖。


RecyclerView

我们为什么要去使用RecyclerView呢?对比我们最常用的ListView,可以发现以下几点:

1.使用方法
ListView仅需要设置adapter即可正常使用,而RecyclerView需要

//设置布局管理器
list.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
list.setAdapter(adapter)
//设置Item增加、移除动画
list.setItemAnimator(new DefaultItemAnimator());

2.ViewHolder
在我们使用ListViewz中,我们经常会使用ViewHolder来进行复用,而在RecyclerView中则直接提供了ViewHolder,我们可以通过继承来使用。

通过以上我们可以发现,RecyclerView正如其命名,只负责对view的回收和复用,其他的一切都交给程序员来实现。这样我们才可以轻松的通过RecyclerView这个控件来实现ListView,GirdView,瀑布流等效果。


CardView

通过CardView我们可以很容易的实现卡片式的布局,当然你也可以使用Drawable、Layout 来实现。但这毕竟需要一定的功底,所以对于不擅长的同学来说,CardView可以轻松满足。


RecyclerView和CardView的使用

RecyclerView

RecyclerView的使用偏向于代码方面,因为本人也只是初次接触所以未做深入的了解,详细的使用可以通过这篇博客来了解。http://blog.csdn.net/lmj623565791/article/details/45059587,下面我只对常用到的方法进行介绍。
1.setLayoutManager
通过这个方法,我们可以很简单的将RecyclerView改造成为Listview,GridView以及瀑布流的形式。例如:

        //线性布局管理器
        list.setLayoutManager(new LinearLayoutManager(this));
        //网格布局管理器
        list.setLayoutManager(new GridLayoutManager(this,2));
        //瀑布流布局管理器
        list.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));

其中StaggeredGridLayoutManager的第二个参数为方向,可设置为VERTICAL和HORIZONTAL。为VERTICAL时表示有多少列,HORIZONTAL则表示有多少行。

2.setItemAnimator
通过这个方法,我们可以为每个item设置添加和删除的动画,官方当然只为我们提供了一种,不过我们可以去自定义或者去GitHub上查找。需要注意的是若要有动画效果,刷新数据集的时候不可以使用notifyDataSetChanged()而要使用notifyItemInserted(position)和notifyItemRemoved(position)。

3.addItemDecoration
该方法可以为每个item之间设置分割线,大家可以通过实现该类的方法来自定义分割线。

4.itemClick与itemLongClick
由于官方并未给出以上两个方法,所以我们只能自己实现。具体实现方法有两种,可以在addOnItemTouchListener中监听手势来实现,也可直接在adapter中去添加回调。这里为大家介绍第二种方法:

private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;

    public interface OnItemClickListener {
        void OnItemClick(View view, int position);
    }

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
        this.mOnItemClickListener = mOnItemClickListener;
    }

    public interface OnItemLongClickListener {
        void OnItemLongClick(View view, int position);
    }

    public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
        this.mOnItemLongClickListener = mOnItemLongClickListener;
    }
    @Override
    public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, int position) {
        //设置点击事件
        if (mOnItemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.OnItemClick(holder.itemView, pos);
                }
            });
        }

        //设置长按事件
        if (mOnItemLongClickListener != null) {
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemLongClickListener.OnItemLongClick(v, pos);
                    return true;
                }
            });
        }
       }

注意:监听需要设置给adapter而不是RecyclerView。


CardView

CardView使用比较简单,xml代码如下:

<android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/card_margin"
        card_view:cardCornerRadius="2dp"
        card_view:cardElevation="4dp"
        android:foreground="?attr/selectableItemBackground">

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

需要导入命名空间

xmlns:card_view="http://schemas.android.com/apk/res-auto"
  • cardCornerRadius:设置卡片边角的角度值
  • cardElevation:设置卡片的阴影

使用过程中设置cardElevation后,在低版本上CardView会留出空间来显现出阴影,而在Lollipop 之后则需要手动设置 Margin 边距来预留空间,否则CardView会挤在一起,因此我们需要为Lollipop之后的版本定义Margin 值:

1.创建 /res/value 和 /res/value-v21 资源文件夹于项目对应目录下,前者放置旧版本或者通用的资源文件,后者放置Lollipop及更高 SDK 版本的资源文件。

2.在文件夹内创建dimens.xml,<dimen name="card_margin">4dp</dimen>填入你期望的值。

3.在布局中使用android:layout_margin="@dimen/card_margin"

通过android:foreground="?attr/selectableItemBackground"可以为CardView设置点击效果,在高版本上为Ripple效果,低版本则为变深到变亮的过程。

RecyclerView和CardView的结合使用Demo

这里写图片描述
Demo下载地址:
https://github.com/AboutJoke/RcDemo
简单的使用介绍就到此为止了,深层次的东西就需要大家自己去挖掘了,同时有任何问题,欢迎和我进行交流。

猜你喜欢

转载自blog.csdn.net/u013200308/article/details/51244289