欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RecyclerView的简单使用

程序员文章站 2022-06-05 12:38:21
...

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);

RecyclerView的简单使用

2.3.2 水平ListView效果

修改LayoutManager参数:
RecyclerView的简单使用

RecyclerView的简单使用

2.3.3 GridView效果

RecyclerView的简单使用

RecyclerView的简单使用

2.3.4 水平GridView效果

RecyclerView的简单使用

RecyclerView的简单使用

2.3.5 瀑布流效果

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

在Adapter里添加如下代码:

RecyclerView的简单使用

RecyclerView的简单使用

在Activity中使用StaggeredGridLayoutManager:

RecyclerView的简单使用

RecyclerView的简单使用

三、分隔线

3.1 简单实现

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

RecyclerView的简单使用

3.2 ItemDecoration的子类实现

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

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());
    }

}

RecyclerView的简单使用

3.3 定制分隔线样式

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

3.3.1 在drawble文件夹下创建资源

文件位置://res/drawable/item_recycler_divider
RecyclerView的简单使用

3.3.2 在style文件中应用

RecyclerView的简单使用

效果:

RecyclerView的简单使用

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

四、item的添加删除动画

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

RecyclerView的简单使用

对RecylerView对象设置动画:

RecyclerView的简单使用

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

RecyclerView的简单使用

效果:

RecyclerView的简单使用

RecyclerView的简单使用

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

五、RecyclerView添加onClick事件

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

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

Adapter:

RecyclerView的简单使用

RecyclerView的简单使用

Activity中:

RecyclerView的简单使用

效果:

RecyclerView的简单使用

相关标签: android android-ui