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>