RecyclerView的简单使用

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


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{

    private LayoutInflater mLayoutInflater;
    private Context mContext;
    private List mDatas;

    public CusSimpleAdapter(Context context, List 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中:

效果:

你可能感兴趣的:(Android,android,android-ui)