RecycleView初尝试
来源:互联网 发布:萧山网络问政平台下载 编辑:程序博客网 时间:2024/06/11 17:45
最近上了Study Jams的课程,布置了一个小作业。为了完成小作业,自己就顺便尝试用了一下RecycleView。
从整体上看RecyclerView的架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人惊艳的效果。
- 控制其排列显示的方式,通过布局管理器LayoutManager(抽象类,系统提供了3个实现类)
- 控制Item间的间隔(可绘制),通过ItemDecoration(抽象类,需自己实现类)
- 控制Item增删的动画,通过ItemAnimator(抽象类,系统提供了1个实现类)
- 控制点击、长按事件,需要自己写
- 自己实现RecycleView.Adapter<ViewHolder>
需要先添加依赖
compile 'com.android.support:recyclerview-v7:23.2.1'
1、LayoutManager
这是一个抽象类,好在系统提供了3个实现类:
- LinearLayoutManager 线性布局管理器,支持横向、纵向。
- GridLayoutManager 网格布局管理器,支持横向、纵向。
- StaggeredGridLayoutManager 瀑布就式布局管理器,支持横向、纵向。
mRecyclerView.setHasFixedSize(true);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);//可以设置滚动的方向,默认竖直滚动 mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter);
GridLayoutManager layoutManager =new GridLayoutManager(this,3);//3行 layoutManager.setOrientation(OrientationHelper.HORIZONTAL);//水平 mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL);//表示2列,并且是竖直方向的瀑布流 mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter);
2、ItemDecoration
抽象类,需自己实现类
ItemDecoration的一个实现类例子
//通过以下方法添加分割线mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));DividerItemDecoration需要继承RecyclerView.ItemDecoration这个抽象类实现一些方法 。有点麻烦,但是可以自定义自己的分割线。如果想简单一点可以直接在item_view里面底部自己添加一根线布局,这样就无需重写了。如下:
<View android:layout_width="match_parent" android:layout_height="1dp" android:background="#8F8F8F"/>
3、ItemAnimator
也是一个抽象类,好在系统为我们提供了一种默认的实现类DefaultItemAnimator()。
// 设置item动画mRecyclerView.setItemAnimator(new DefaultItemAnimator());
更新数据集不是用adapter.notifyDataSetChanged()
而是notifyItemInserted(position)
与notifyItemRemoved(position)
RecyclerView.Adapter和BaseAdapter相比,额外提供了一下这些方法:
// 数据发生了改变,那调用这个方法,传入改变对象的位置。public final void notifyItemChanged(int position);// 可以刷新从positionStart开始itemCount数量的item了public final void notifyItemRangeChanged(int positionStart, int itemCount);// 对象从fromPosition移动到toPosition public final void notifyItemMoved(int fromPosition, int toPosition); //批量添加 public final void notifyItemRangeInserted(int positionStart, int itemCount);//批量删除public final void notifyItemRangeRemoved(int positionStart, int itemCount);
4、点击事件
你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 也可以通过adapter中自己去提供回调。
这里使用第二种,使用接口回调的方法。
在Adapter类中添加以下的接口:
public interface OnRecyclerViewItemClickListener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } private OnRecyclerViewItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; }在Adapter类中的onBindViewHolder()方法回调接口
//点击事件回调 if(mOnItemClickListener != null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(holder.itemView,position); } }); //longClick holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onItemLongClick(holder.itemView,position); return false; } }); }在需要实现RecycleView点击事件的类中实现接口
mAdapter.setOnItemClickListener(this);
5、RecycleView.Adapter<ViewHolder>
需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。主要实现三个方法:
- getItemCount 这个不用说,获取总的条目数
- onCreateViewHolder 创建ViewHolder
- onBindViewHolder 将数据绑定至ViewHolder
我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。
//自定义的ViewHolder,持有每个Item的的所有界面元素class ViewHolder extends RecyclerView.ViewHolder { ImageView mAvatar; TextView mName; public ViewHolder(View view) { super(view); mAvatar = (ImageView) view.findViewById(R.id.img_avatar); mName = (TextView) view.findViewById(R.id.txt_name); }}
例子源码
- RecycleView初尝试
- RecycleView初体验
- recycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- recycleview
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- RecycleView
- recycleview
- EJB3初尝试
- Android初尝试
- html复习第七天 京东首页布局完成
- 转载:Hive的安装以及使用
- OS X 快捷键——上篇
- 3D 标签云
- 一个主机两个域名对应两个网站
- RecycleView初尝试
- 设计模式读书笔记-----单例模式
- 如何利用github打造博客专属域名
- 选择排序C++实现
- 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
- Android中使用shape
- 设计模式读书笔记-----适配器模式
- wchar_t类型字符串的处理
- 微信网页开发