android中RecyclerView的简单使用(一)
来源:互联网 发布:黄金储备数据 编辑:程序博客网 时间:2024/06/05 22:57
RecyclerView是什么?
RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。RecyclerView 是Android 版本中新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好。
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。
与传统ListView的区别:
RecyclerView与老前辈ListView的不同点,主要在于以下几个特性:
Adapter中的ViewHolder模式 - 对于ListView来说,通过创建ViewHolder来提升性能并不是必须的。因为ListView并没有严格的ViewHolder设计模式。但是在使用RecyclerView的时候,Adapter必须实现至少一个ViewHolder,必须遵循ViewHolder设计模式。
RecyclerView是android 5.0特性,用来取代listview和gridview的控件。
它的优点是:可以一个控件实现 listView gridView 和瀑布流(推荐使用框架)
解决了listView条目复用产生的图片错位的问题
它的缺点是:条目点击事件需要自己写
分割线需要自己自定义编写
5.0以下需要导入jar文件包
如何使用RecyclerView?
如果使用RecyclerView,你需要了解以下三个元素:
- RecyclerView.Adapter
- LayoutManager
- ItemAnimator
确切的说,Adapter扮演着两个角色。一是,根据不同ViewType创建与之相应的的Item-Layout,二是,访问数据集合并将数据绑定到正确的View上。这就需要我们重写以下两个函数:
*public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 创建Item视图,并返回相应的ViewHolder
*public void onBindViewHolder(VH holder, int position) 绑定数据到正确的Item视图上。
public int getItemCount() 返回该Adapter所持有的Itme数量
ViewHolder的基本用法是用来存放View对象。Android团队很早之前就推荐使用“ViewHolder设计模式”,但实际上他们并没有把这种概念强加给开发者,而且也没有要求开发者在Adapter中必须使用ViewHolder pattern。那么现在对于这种新型的RecyclerView.Adapter,我们必须实现并使用它。
RecyclerView.LayoutManager
LayoutManager的职责是摆放Item的位置,并且负责决定何时回收和重用Item。必须为RecyclerView指定LayoutManager,否则会出现异常
目前SDK中提供了三种自带的LayoutManager:
LinearLayoutManager 水平或者垂直的Item视图。
GridLayoutManager 网格Item视图。
StaggeredGridLayoutManager 交错的网格Item视图。瀑布流
RecyclerView.ItemDecoration
通过设置recyclerView.addItemDecoration(new DividerDecoration(this));来改变Item之间的偏移量或者对Item进行装饰。
RecyclerView.ItemDecoration是一个抽象类,可以通过重写以下三个方法,来实现Item之间的偏移量或者装饰效果:
public void onDraw(Canvas c, RecyclerView parent) 装饰的绘制在Item条目绘制之前调用,所以这有可能被Item的内容所遮挡
public void onDrawOver(Canvas c, RecyclerView parent) 装饰的绘制在Item条目绘制之后调用,因此装饰将浮于Item之上
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) 与padding或margin类似,LayoutManager在测量阶段会调用该方法,计算出每一个Item的正确尺寸并设置偏移量。
RecyclerView.ItemAnimator
ItemAnimator能够帮助Item实现独立的动画。
ItemAnimator作触发于以下三种事件:
某条数据被插入到数据集合中
从数据集合中移除某条数据
更改数据集合中的某条数据
幸运的是,在Android中默认实现了一个DefaultItemAnimator,我们可以通过以下代码为Item增加动画效果:
recyclerView.setItemAnimator(new DefaultItemAnimator());
在之前的版本中,当时据集合发生改变时,我们通过调用.notifyDataSetChanged(),来刷新列表,因为这样做会触发列表的重绘,所以并不会出现任何动画效果,因此需要调用一些以notifyItem*()作为前缀的特殊方法,比如:
public final void notifyItemInserted(int position) 向指定位置插入Item
public final void notifyItemRemoved(int position) 移除指定位置Item
public final void notifyItemChanged(int position) 更新指定位置Item
这些就是RecyclerView的一些基础知识。下面贴一些代码,方便理解。
public class MainActivity extends Activity implements CallBack {private LinearLayout mLin;private RecyclerView recycle;private List<String> list=new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initList(); initView(); }private void initView() {mLin=(LinearLayout) findViewById(R.id.mLin);recycle=new RecyclerView(this);recycle.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));mLin.addView(recycle);LinearLayoutManager manager=new LinearLayoutManager(this);//线性布局管理器,支持横向和纵向manager.setOrientation(LinearLayoutManager.HORIZONTAL);recycle.setLayoutManager(manager);recycle.setHasFixedSize(true);//固定宽高recycle.setItemAnimator(new DefaultItemAnimator());//默认的条目添加动画recycle.setAdapter(new MyAdapter(this, list, this));}private void initList() {for(int i=0;i<30;i++){list.add("第"+(i+1)+"条数据");}}@Overridepublic void call(int index) {Toast.makeText(this, list.get(index), 0).show();}}下面是adapter里面的代码:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH>{private Context ctx;private List<String> list;private CallBack call;public MyAdapter(Context ctx,List<String> list,CallBack call) {this.ctx=ctx;this.list=list;this.call=call;}//内部类--》找IDclass VH extends RecyclerView.ViewHolder{private TextView tv;private ImageView img;private View view;public VH(View arg0) {super(arg0);tv=(TextView) arg0.findViewById(R.id.tv);img=(ImageView) arg0.findViewById(R.id.img);view=arg0.findViewById(R.id.view);}}@Overridepublic int getItemCount() {return list.size();}//arg0==holder arg1:position@Overridepublic void onBindViewHolder(VH arg0, final int arg1) {arg0.img.setImageResource(R.drawable.ic_launcher);arg0.tv.setText(list.get(arg1));arg0.view.setBackgroundColor(Color.BLACK);//自己写的条目点击事件arg0.tv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {call.call(arg1);}});}@Overridepublic VH onCreateViewHolder(ViewGroup arg0, int arg1) {View v=View.inflate(ctx, R.layout.item, null);return new VH(v);}public interface CallBack{public void call(int index);//index:是你要点击的那个条目对应的在list中的位置:position}}
xml中的代码比较简单,就不贴了。
不足之处请多指教!!!
- android中RecyclerView的简单使用(一)
- RecyclerView的简单使用--------------(一)
- RecyclerView的简单使用(一)
- Android 中RecyclerView使用详解(一)
- Android RecyclerView的使用(一)
- RecyclerView(一)最简单的recyclerview
- Android RecyclerView 的简单使用
- android RecyclerView的简单使用
- Android RecyclerView 的简单使用
- Android之RecyclerView简单使用(一)
- RecyclerView中ItemDecoration的简单使用(一)--设置item的padding
- Android 中简单使用RecyclerView 和CardView
- Android中RecyclerView的使用
- android中RecyclerView的使用
- Android中RecyclerView的使用
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- android中RecyclerView的简单使用(二)——分割线
- android中RecyclerView的简单使用(三)——瀑布流
- c编写hello world
- 量化进阶——如何进行期权套利(一)
- hdu1251-字典树
- Webrtc windows 编译
- 6.面向对象(中)
- android中RecyclerView的简单使用(一)
- Ubuntu Kylin 16.04 下搭建nfs网络文件系统服务器
- linux 三板斧
- angularjs ng-click无效的可能原因
- 超详细mysql left join,right join,inner join用法分析
- 二维计算几何模板
- 最基础的python抓取网站图片例子
- HDU2004 成绩转换
- 练习题 No.17 set容器