2.RecyclerView系列之二ItemDecoration==========实现时间轴控件
3.RecyclerView系列之三自定义LayoutManager===实现滚轮翻页的效果。
5.RecyclerView系列之三自定义=================添加 侧滑删除,拖拽动画。
6.RecyclerView系列之四实现回收复用 .嵌套滑动机制 和实现局部刷新 RecyclerView和listview的比较
7.RecycerView系列之六======================实现滚动画廊控件,轮播图的自定义控件 Gallery
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。RecyclerView的官方定义如下:
使用场景:
比如:有一个需求是屏幕竖着的时候的显示形式是ListView,屏幕横着的时候的显示形式是2列的GridView,此时如果用RecyclerView,则通过设置LayoutManager一行代码实现替换。
使用
1.导入Support-v7包
implementation 'com.android.support:recyclerview-v7:21.0.3'
重要:一般写一个类继承 RecyclerView.ViewHolder
然后在class中继承 public class ViewAdapter extends RecyclerView.Adapter
static class ViewHolder extends RecyclerView.ViewHolder {
View view;
ImageView imageView;
TextView textView;
public ViewHolder(View itemView, int ivi, int tvi) {
super(itemView);
view=itemView;
imageView=(ImageView) itemView.findViewById(ivi);
textView=(TextView) itemView.findViewById(tvi);
}
}
}
2.当我们写一个Adapter的类派生自RecyclerView.Adapter
public class RecyclerAdapter extends RecyclerView.Adapter
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
public class ViewAdapter extends RecyclerView.Adapter
private Context context;
private List
private int layoutResId;
private int imageViewId;
private int textViewId;
private boolean isCenterCrop;
public ViewAdapter(Context c, List
context=c;
datas=list;
layoutResId=lri;
imageViewId=ivi;
textViewId=tvi;
isCenterCrop=centerCrop;
}
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(layoutResId, parent, false);
return new ViewHolder(view, imageViewId, textViewId);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final Animal animal=datas.get(position);
if(isCenterCrop)
Glide.with(context).load(animal.getImgResId()).centerCrop().into(holder.imageView);
else
Glide.with(context).load(animal.getImgResId()).into(holder.imageView);
holder.textView.setText(animal.getDescription());
holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(context, DetailActivity.class);
intent.putExtra("IMG_RES_ID", animal.getImgResId());
intent.putExtra("DESCRIPTION", animal.getDescription());
context.startActivity(intent);
}
});
holder.view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(context, "第"+position+"个元素", Toast.LENGTH_SHORT).show();
return true;
}
});
}
@Override
public int getItemCount() {
return datas.size();
}
public void addItem(int position) {
datas.add(position, ResourceUtils.getRandomAnimal());
notifyItemInserted(position);
}
public void removeItem(int position) {
if(position>=0 && position
datas.remove(position);
notifyItemRemoved(position);
}
}
static class ViewHolder extends RecyclerView.ViewHolder {
View view;
ImageView imageView;
TextView textView;
public ViewHolder(View itemView, int ivi, int tvi) {
super(itemView);
view=itemView;
imageView=(ImageView) itemView.findViewById(ivi);
textView=(TextView) itemView.findViewById(tvi);
}
}
}
这里与listVIew唯一的区别是,这里需要设置一个LayoutManager对象,这里设置的是LinearLayoutManager,也就是垂直列表。我们知道Adapter的职责是用数据将每个Item的控件填充起来。而RecycerView与ListView不一样的是,它不仅能实现传统的滑动的列表,还能实现GridView和瀑布流造型,或者其它各式各样的特殊造型。而这些造型的实现就是通过LayoutManger来实现的,我们通过Adapter将Item填充了以后,那每个Item怎么摆放是由谁来做的呢?摆放Item的操作就是使用LayoutManager来实现出来的。所以每个LayoutManger所实现的摆放Item的方式都是不一样的,比如:LinearLayoutManager就是传统的ListView的功能,上下滚动或者左右滚动。而GridLayoutManager则是网格摆放,而StaggeredGridLayoutMnager则是瀑布流摆放。
到这里,我们就实现了本部分开头的上下滚动的效果了。
---------------------
1.RecyclerView分组效果
2.添加华丽的分割线--装饰(时间轴控件)
自定义装饰
DividerItemDecoration mDivider = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(mDivider);
那ItemDecoration与Item是什么关系呢?对于英语来讲,Decoration是装饰的意思
自定义:public class LinearItemDecoration extends RecyclerView.ItemDecoration
public class LinearItemDecoration extends RecyclerView.ItemDecoration {
private Paint mPaint;
private Bitmap mBmp;
public LinearItemDecoration(Context context) {
mPaint = new Paint();
mPaint.setColor(Color.GREEN);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
mBmp = BitmapFactory.decodeResource(context.getResources(),R.mipmap.icon,options);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
c.drawBitmap(mBmp,0,child.getTop(), mPaint);
}
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.left = 200;
outRect.bottom = 1;
}
}
RecyclerView能够通过mRecyclerView.setItemAnimator(ItemAnimator animator)
设置添加、删除、移动、改变的动画效果。
RecyclerView能够通过mRecyclerView.setItemAnimator(ItemAnimator animator)
设置添加、删除、移动、改变的动画效果。
RecyclerView提供了默认的ItemAnimator实现类:DefaultItemAnimator。如果没有特殊的需求,默认使用这个动画即可。
// 设置Item添加和移除的动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
3.自定义LayoutManager :
自定义LayoutManager来制作第一个滚轮翻页的效果。
LayoutManager主要用于布局其中的Item,在LayoutManager中能够对每个Item的大小,位置进行更改,将它放在我们想要的位置,在很多优秀的效果中,都是通过自定义LayoutManager来实现的,比如:
public class CustomLayoutManager extends LayoutManager {
@Override
public LayoutParams generateDefaultLayoutParams() {
return null;
}
}
先生成一个类CustomLayoutManager,派生自LayoutManager:
1.2 RecyclerView的回收复用原理
从上面的对比中可以看出,RecyclerView确实是存在回收复用的,但回收复用是需要我们在自定义的LayoutManager中处理的,而不是会自动具有这个功能,那么问题来了,我们要怎么给自定义的LayoutManager添加上回收复用功能呢?
在讲解自定义回收复用之前,我们需要先了解RecyclerView是如何处理回收复用的。
1.2.1 简述RecyclerView的回收复用原理
其实RecyclerView内部已经为我们实现了回收复用所必备的所有条件,但在LayoutManager中,我们需要写代码来标识每个holderView是否继续可用,还是要把它放在回收池里面去。很明显,我们在上面的实例代码中,我们只是通过layoutDecorated(……)来布局Item,而对已经滚出屏幕的HolderView没有做任何处理,更别说给他们添加已经被移除的标识了。所以我们写的CustomLayoutManager不能复用HolderView的原因也在这。下面我们来看看RecyclerView给我们已经做好了哪方面准备,我们先来整体理解下RecyclerView的回收复用原理,然后再写代码使我们的CustomLayoutManager具有回收复用功能。
---------------------
ListView相比RecyclerView,有一些优点:
addHeaderView()
, addFooterView()
添加头视图和尾视图。setOnItemClickListener()
和setOnItemLongClickListener()
设置点击事件和长按事件。这些功能在RecyclerView中都没有直接的接口,要自己实现(虽然实现起来很简单),因此如果只是实现简单的显示功能,ListView无疑更简单。
RecyclerView相比ListView,有一些明显的优点:
if(convertView == null)
的实现,而且回收机制更加完善。RecyclerView是一个插件式的实现,对各个功能进行解耦,从而扩展性比较好。
RecyclerView提供了notifyItemInserted()
,notifyItemRemoved()
,notifyItemChanged()
等API更新单个或某个范围的Item视图。
参考博客
https://blog.csdn.net/harvic880925/article/details/86606873
https://www.jianshu.com/p/4f9591291365
demo地址:
https://download.csdn.net/download/harvic880925/10933790