Recyclerview专题-Recyclerview初体验

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

Recyclerview简述和兼容包

Recyclerview是Android官方5.0以后提出的一个新Widgets,以解决ListView、GridView在复用优化时需要编写大量冗余代码的问题。

使用前需使用版本兼容包:

com.android.support:recyclerview-v7:${supportVersion}	

为什么Recyclerview比ListView、GridView更好用

优点

  • Recyclerview专注于布局的复用机制,而不是专注于布局本身。
  • 一个Recyclerview组件通过改变LayoutManager就能实现ListView、GridView、瀑布流三种展示效果
  • 轻量级实现水平滑动展示效果
  • Recyclerview扩展性更好、更灵活

缺点

  • 没有实现onItemClick点击事件,需手动实现

Recyclerview的基础概念

RecyclerView.Adapter:数据适配器,包装数据集合并且为每个条目创建视图

RecyclerView.ViewHolder:复用View的对象,保存用于显示每个数据条目的子View

RecyclerView.LayoutManager:布局管理器,控制RecyclerView水平展示、网格展示、瀑布三种效果的切换

RecyclerView.ItemDecoration:子项间隔的扩展

RecyclerView.ItemAnimator:控制添加、删除、重排序的动画效果(注意只有执行notifyItemInserted、notifyItemRemoved等操作才有效)

android:clipToPadding:默认为true,为true时RecyclerView的子View会包含padding重复计算,比较通俗的场景是为true间隔线会考虑RecyclerView的Padding、为false时不考虑

Recyclerview的基础使用-ListView效果的实现

样例参考于:https://www.cnblogs.com/anni-qianqian/p/6587329.html

第一步-编写布局:

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

第二步-编写Adapter:

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{	
	private List<String> mLists;
	
	HomeAdapter(List<String> lists){
		if(lists==null){
			lists=Arrlist();
		}
		mLists=lists;
	}		

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
                HomeActivity.this).inflate(R.layout.item_home, parent,
                false));
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position)
    {
        holder.tv.setText(mDatas.get(position));
    }

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

    class MyViewHolder extends ViewHolder
    {

        TextView tv;

        public MyViewHolder(View view)
        {
            super(view);
            tv = (TextView) view.findViewById(R.id.id_num);
        }
    }
}

第三步-编写R.layout.item_home复用布局

省略该操作…

第四步-adapter和布局进行绑定

 mRecyclerView = (RecyclerView) findViewById(R.id.rv);
 mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
 mRecyclerView.setAdapter(mAdapter = new HomeAdapter(mDatas));

第五步-添加默认的间隔和默认的动画

// 设置默认item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加默认的间隔
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,
DividerItemDecoration.VERTICAL_LIST));

Recyclerview的基础使用-GridView效果的实现

样例参考于:https://www.cnblogs.com/anni-qianqian/p/6587329.html

Recyclerview的扩展性好在于,当我们需要从ListView切换到GridView、或者其他效果时,只需要很少的改动即可完成,比如我们需要把上面的代码改写成GridView

1、更改Adapter中onCreateViewHolder复用布局以适应网格效果展示

2、更改布局管理器为

	//this为上下文、4为横排展示的子Item数量
    mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));

3、更改间隔展示(请移步后面对间隔线的专题)

Recyclerview的基础使用-水平滑动、瀑布的实现

通过更改布局适配器为StaggeredGridLayoutManager我们能很简单的实现水平滑动

StaggeredGridLayoutManager具有两个参数:

  • orientation 规定滑动的方向 StaggeredGridLayoutManager.VERTICAL垂直滑动 StaggeredGridLayoutManager.HORIZONTAL水平滑动
  • spanCount 根据spanCount定义行列的个数,当orientation为StaggeredGridLayoutManager.VERTICAL时,定义列数

水平滑动效果:

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL));

垂直滑动效果:

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));

类似于

mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));

当我们需要实现瀑布流效果时,只需要Item布局不固定高度、就可以实现瀑布流效果。

Recyclerview的ItemDecoration

ItemDecoration简述

Recyclerview.ItemDecoration作为抽象接口扩展了修饰 Recyclervie 展示的行为,常用于实现该类以达到添加子项的间隔。

当我们需要自定义间隔线的时候,只需要实现Recyclerview.ItemDecoration然后设置就可以显示间隔线,扩展性非常好,默认情况下没有间隔线。

ItemDecoration的列表间隔实现类-DividerItemDecoration

我们先来看一下官方提供给我们的两个定义间隔线的实现类:

构造器

  • DividerItemDecoration(Context context, int orientation)

DividerItemDecoration实现了Recyclerview.ItemDecoration完成对Recyclerview中的子项底部和右部的装饰,既当我们想要实现在子项底部添加间隔或者在右边添加间隔时,可以使用该实现类。

DividerItemDecoration的构造器有两个参数,第一个参数是上下文对象,第二个参数是定义的是间隔装饰在子项中的低部还是右边。

  • DividerItemDecoration.HORIZONTAL 定义间隔在右边
  • DividerItemDecoration.VERTICAL 定义间隔在底部

定义间隔在右边效果图:

定义间隔在底部效果图:

对外开发的方法

  • setOrientation(int orientation):设置间隔的方向,既装饰的展示位置。
  • setDrawable(@NonNull Drawable drawable):设置展示的Drawable,默认为android.R.attr.listDivider

第一个方法,类似于构造器中的参数二。
第二个方法是为了自定义Drawable的展示效果的,真正开发过程中,android.R.attr.listDivider会根据不同的设备和Android系统版本展示不同的效果,为了进行兼容,我们非常有必要对间隔的样式进行统一的定制。

根据setDrawable方法自定义间隔样式的方法:

1、定义展示的xml:

divide_test.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	tools:ignore="ResourceName"
	android:shape="rectangle">
	<gradient
    	android:angle="45"
    	android:endColor="@color/colorPrimary"
    	android:startColor="@color/colorAccent" />
	<size android:height="4dp" android:width="4dp"/>
</shape>

案例中,android:height定义间隔的高、android:width定义间隔的宽,是必须的,如果不设置将默认不显示,案例使用了渐变色,也可以定义纯色间隔线,一般使用#efefef,高度为1dp

2、第二步,将xml转化成Drawable并设置:

val divice = ContextCompat.getDrawable(this@TestRvActivity, R.drawable.divide_test)
if (divice != null) {
      dividerItemDecoration.setDrawable(divice)
}

也可以在Activity Theme中通过android:listDivider标签修改全局的间隔展示

<item name="android:listDivider">@drawable/divice_test</item>

猜你喜欢

转载自blog.csdn.net/u010782846/article/details/84060341