RecyclerView的简单使用

来源:互联网 发布:2017格里芬体测数据 编辑:程序博客网 时间:2024/05/29 10:49

RecyclerView的使用

优点(代码稍显复杂,但是扩展性极高):

1. RecyclerView封装了viewholder的回收复用;2. RecyclerView可以通过设置LayoutManager的实例使RecyclerView显示出不同的风格;3. RecyclerView可以通过ItemDecoration的子类绘制出千变万化的分隔效果;4. RecyclerView可以通过ItemAnimator的子类实现不同的动画效果。

使用RecyclerView能实现的效果:ListView、横向ListView、GridView、横向GridView、瀑布流。

一、导包

eclipse:复制自己电脑sdk\extras\android\support\v7\recyclerview\libs下的android-support-v7-recyclerview.jar到项目的libs文件夹下。

AndroidStudio:compile ‘com.android.support:recyclerview-v7:25.3.1’(注意跟module的compileSdkVersion版本一致)

二、简单使用

2.1 xml

<android.support.v7.widget.RecyclerView    android:layout_width="match_parent"    android:layout_height="match_parent" />

2.2 Adapter

import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.tiddlerliu.oktest.R;import java.util.List;public class CusSimpleAdapter extends RecyclerView.Adapter<CusSimpleAdapter.CusViewHolder>{    private LayoutInflater mLayoutInflater;    private Context mContext;    private List<String> mDatas;    public CusSimpleAdapter(Context context, List<String> datas){        mContext = context;        mDatas = datas;        mLayoutInflater = LayoutInflater.from(context);    }    @Override    public CusViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //创建ViewHolder        View view= mLayoutInflater.inflate(R.layout.item_recycler_list1,parent,false);        CusViewHolder cusViewHolder = new CusViewHolder(view);        return cusViewHolder;    }    @Override    public void onBindViewHolder(CusViewHolder holder, int position) {        //通过ViewHolder设置值        holder.textView.setText(mDatas.get(position));    }    @Override    public int getItemCount() {        return mDatas.size();    }    /** ViewHolder初始化 */    class  CusViewHolder extends RecyclerView.ViewHolder{        TextView textView;        public CusViewHolder(View itemView) {            super(itemView);            textView = (TextView) itemView.findViewById(R.id.item_recycler_list1_tv);        }    }}

2.3 Activity中的设置

2.3.1 垂直ListView效果

mAdapter = new CusSimpleAdapter(mContext, mDatas);//mDatas为数据源    mRvRecycler.setAdapter(mAdapter);//设置RecyclerView的布局--参数含义:{context,水平or垂直,是否倒叙显示}默认为垂直方向LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,            LinearLayoutManager.VERTICAL, false);mRvRecycler.setLayoutManager(linearLayoutManager);

2.3.2 水平ListView效果

修改LayoutManager参数:

2.3.3 GridView效果

2.3.4 水平GridView效果

2.3.5 瀑布流效果

为了模拟瀑布流效果,item的高度使用随机数生成。ps:item的布局文件高度不能写成固定高度。

在Adapter里添加如下代码:

在Activity中使用StaggeredGridLayoutManager:

三、分隔线

3.1 简单实现

如果只是简单的显示背景色,可以给Item的layout添加layout_margin属性(效果为2.3.5瀑布流效果)。

3.2 ItemDecoration的子类实现

以绘制垂直linear分隔线为例,绘制分隔线即绘制item之间的绿色长方形区域,item(黄色)与分隔线(绿色)之间的区域是ItemLayout文件的layout_marginBottom属性(蓝色)。以下为垂直风格示意图:

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.RecyclerView;import android.view.View;/** * 绘制RecyclerView的Linear风格divider */public class RecLinearItemDecoration extends RecyclerView.ItemDecoration {    //使用系统默认分隔线的Drawable资源ID    private static final int[] ATTRS = {android.R.attr.listDivider};    //分隔线    private Drawable mDivider;    //构造方法    public RecLinearItemDecoration(Context context) {        //获取TypedArray对象        TypedArray typedArray = context.obtainStyledAttributes(ATTRS);        //获取系统提供的分隔线Drawable对象        mDivider = typedArray.getDrawable(0);        typedArray.recycle();//回收资源    }    //绘制所有item的分隔线    @Override    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {        //获取item距离左边缘的距离(X1坐标)        int left = parent.getPaddingLeft();        //获取item距离右边缘的距离(X2坐标)        int right = parent.getWidth() - parent.getPaddingRight();        //获取item的总数        int childCount = parent.getChildCount();        //开始所有item之间的分隔线        for (int i = 0; i < childCount; i++) {            //获取当前的item            View childView = parent.getChildAt(i);            //获取当前item的布局参数信息            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();            //计算分隔线上侧y坐标(Y1坐标)            int top = childView.getBottom() + params.bottomMargin;            //计算分隔线下侧y坐标(Y2坐标)            int bottom = top + mDivider.getIntrinsicHeight();//Y1 + 分隔线高度            //设置分隔线绘制位置            mDivider.setBounds(left, top, right, bottom);            //开始绘制            mDivider.draw(c);//将mDivider绘制到画布c上        }    }    //设置item偏移量(绘制divider的间隙),默认情况下不不绘制divider    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        //向下偏移量为分隔线高度        outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());    }}

3.3 定制分隔线样式

上述子类中使用系统默认分隔线的Drawable资源ID,如果想改变分隔线颜色、宽度,可以使用Theme Style设置。

3.3.1 在drawble文件夹下创建资源

文件位置://res/drawable/item_recycler_divider

3.3.2 在style文件中应用

效果:

GitHub上的开源库地址,封装了各种RecyclerView分隔线。点击跳转

四、item的添加删除动画

首先,在Adapter里添加方法。调用相应方法才会有动画效果

对RecylerView对象设置动画:

调用Adapter里的添加删除方法:

效果:

GitHub上的开源库地址,封装了各种RecyclerView动画。点击跳转

五、RecyclerView添加onClick事件

RecyclerView对它的item并没有提供OnClickListener()和OnItemLongClickListener()回调方法。

简单示例:在Adapter中增加事件接口,在Activity中调用。

Adapter:

Activity中:

效果: