理解Recyclerview的使用.docx
- 文档编号:14826322
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:23
- 大小:20.62KB
理解Recyclerview的使用.docx
《理解Recyclerview的使用.docx》由会员分享,可在线阅读,更多相关《理解Recyclerview的使用.docx(23页珍藏版)》请在冰点文库上搜索。
理解Recyclerview的使用
理解Recyclerview的使用
1.RecyclerView是什么?
RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。
看到这也许有人会问,不是已经有ListView了吗,为什么还要RecyclerView呢?
这就牵扯到第二个问题了。
2.RecyclerView的优点是什么?
根据官方的介绍RecyclerView是ListView的升级版,既然如此那RecyclerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下:
①RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
②提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
例如:
你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等),也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。
你想控制Item的分隔线,可以通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
③可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。
recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
LinearLayoutManagerlayoutManager=newLinearLayoutManager(this);
//设置布局管理器
recyclerView.setLayoutManager(layoutManager);
//设置为垂直布局,这也是默认的
layoutManager.setOrientation(OrientationHelper.VERTICAL);
//设置Adapter
recyclerView.setAdapter(recycleAdapter);
//设置分隔线
recyclerView.addItemDecoration(newDividerGridItemDecoration(this));
//设置增加或删除条目的动画
recyclerView.setItemAnimator(newDefaultItemAnimator());
可以看到对RecylerView的设置过程,比ListView要复杂一些,虽然代码抒写上有点复杂,但它的扩展性是极高的。
在了解了RecyclerView的一些控制之后,紧接着来看看它的Adapter的写法,RecyclerView的Adapter与ListView的Adapter还是有点区别的,RecyclerView.Adapter,需要实现3个方法:
a)onCreateViewHolder()
这个方法主要生成为每个Iteminflater出一个View,但是该方法返回的是一个ViewHolder。
该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。
直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
b)onBindViewHolder()
这个方法主要用于适配渲染数据到View中。
方法提供给你了一viewHolder而不是原来的convertView。
c)getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
接下来通过几个小的实例帮助大家更深入的了解RecyclerView的用法。
例子1:
用RecyclerView实现一个图片滚动的列表
代码如下:
publicclassMainActivityextendsActionBarActivity{
privateRecyclerViewmRecyclerView;
privateList
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
//得到控件
mRecyclerView=(RecyclerView)findViewById(R.id.recyclerview);
//设置布局管理器
LinearLayoutManagerlayoutManager=newLinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
//设置适配器
mRecyclerView.setAdapter(newMyRecyclerAdapter(this,mDatas));
}
privatevoidinitData(){
mDatas=newArrayList
R.drawable.kenan2,R.drawable.kenan3,R.drawable.kenan4,
R.drawable.kenan5,R.drawable.kenan6,R.drawable.kenan7,
R.drawable.kenan8));
}
}
publicclassDividerItemDecorationextendsItemDecoration{
publicDividerItemDecoration(){
super();
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidgetItemOffsets(RectoutRect,Viewview,RecyclerViewparent,
Statestate){
//TODOAuto-generatedmethodstub
super.getItemOffsets(outRect,view,parent,state);
}
@Override
@Deprecated
publicvoidonDraw(Canvasc,RecyclerViewparent){
//TODOAuto-generatedmethodstub
super.onDraw(c,parent);
}
}
publicclassMyRecyclerAdapterextendsAdapter
privateContextmContext;
privateList
publicMyRecyclerAdapter(Contextcontext,List
super();
this.mContext=context;
this.mDatas=datas;
}
@Override
publicintgetItemCount(){
//TODOAuto-generatedmethodstub
returnmDatas.size();
}
@Override
//填充onCreateViewHolder方法返回的holder中的控件
publicvoidonBindViewHolder(MyHolderholder,intposition){
//TODOAuto-generatedmethodstub
holder.imageView.setImageResource(mDatas.get(position));
}
@Override
//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
publicMyHolderonCreateViewHolder(ViewGrouparg0,intarg1){
//填充布局
Viewview=LayoutInflater.from(mContext).inflate(R.layout.item,null);
MyHolderholder=newMyHolder(view);
returnholder;
}
//定义内部类继承ViewHolder
classMyHolderextendsViewHolder{
privateImageViewimageView;
publicMyHolder(Viewview){
super(view);
imageView=(ImageView)view.findViewById(R.id.iv_item);
}
}
}
效果如下:
这里写图片描述
3.为RecyclerView添加OnItemClickListener回调
效果很不错,这就是RecyclerView的基本用法了,但细心的你会发现,竟然没有提供setOnItemClickListener这个回调,也就是无法响应点击事件,然而在日常开发中,响应点击事件无疑都是必须的,虽然它没有提供,但是我们可以手动添加OnItemClickListener,我们可以在Adapter中添加这个回调接口:
例子2:
可以点击的RecyclerView
在原工程基础上对Adapter进行修改,添加OnItemClickListener接口,由于具体点击后的逻辑是交给MainActivity去确定的,所以我们定义抽象的OnItemClickListener接口,里面有一个抽象方法,用于设置被点击后的逻辑:
//item的回调接口
publicinterfaceOnItemClickListener{
voidonItemClick(Viewview,intPosition);
}
对外暴露一个设置点击监听器的方法,其中传入需要OnItemClickListener接口
//定义一个设置点击监听器的方法
publicvoidsetOnItemClickListener(OnItemClickListeneritemClickListener){
this.mItemClickListener=itemClickListener;
}
在绑定ViewHolder的逻辑之中,对RecyclerView的每一个itemView设置点击事件:
@Override
//填充onCreateViewHolder方法返回的holder中的控件
publicvoidonBindViewHolder(finalMyHolderholder,finalintposition){
//TODOAuto-generatedmethodstub
holder.imageView.setImageResource(mDatas.get(position));
//如果设置了回调,则设置点击事件
if(mItemClickListener!
=null){
holder.itemView.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
mItemClickListener.onItemClick(holder.itemView,position);
}
});
}
}
最后粘上Adapter的全部代码,其他代码均和例子1一样
publicclassMyRecyclerAdapterextendsAdapter
privateContextmContext;
privateList
privateOnItemClickListenermItemClickListener;
publicMyRecyclerAdapter(Contextcontext,List
super();
this.mContext=context;
this.mDatas=datas;
}
//item的回调接口
publicinterfaceOnItemClickListener{
voidonItemClick(Viewview,intPosition);
}
//定义一个设置点击监听器的方法
publicvoidsetOnItemClickListener(OnItemClickListeneritemClickListener){
this.mItemClickListener=itemClickListener;
}
@Override
publicintgetItemCount(){
//TODOAuto-generatedmethodstub
returnmDatas.size();
}
@Override
//填充onCreateViewHolder方法返回的holder中的控件
publicvoidonBindViewHolder(finalMyHolderholder,finalintposition){
//TODOAuto-generatedmethodstub
holder.imageView.setImageResource(mDatas.get(position));
//如果设置了回调,则设置点击事件
if(mItemClickListener!
=null){
holder.itemView.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
mItemClickListener.onItemClick(holder.itemView,position);
}
});
}
}
@Override
//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
publicMyHolderonCreateViewHolder(ViewGroupviewgroup,inti){
//填充布局
Viewview=LayoutInflater.from(mContext).inflate(R.layout.item,null);
MyHolderholder=newMyHolder(view);
returnholder;
}
//定义内部类继承ViewHolder
classMyHolderextendsViewHolder{
privateImageViewimageView;
publicMyHolder(Viewview){
super(view);
imageView=(ImageView)view.findViewById(R.id.iv_item);
}
}
}
效果如下:
这里写图片描述
4.自定义RecyclerView实现滚动时内容联动
例子3:
RecyclerView制作相册效果
效果:
在原工程的基础上进行修改,改成相册效果,即上面显示一张大图,下面的RecyclerView做为图片切换的指示器。
首先修改下布局:
android=" xmlns: tools=" android: layout_width="match_parent" android: layout_height="match_parent" android: orientation="vertical" tools: context="com.example.recyclerviewdemo.MainActivity"> android: id="@+id/iv_group" android: layout_width="match_parent" android: layout_height="0dp" android: layout_margin="10dp" android: layout_weight="1" android: scaleType="centerCrop" android: src="@drawable/ic_launcher"/> -- android: layout_width="fill_parent" android: layout_height="0dp" android: layout_weight="1"> android: id="@+id/iv_group" android: layout_width="fill_parent" android: layout_height="fill_parent" android: layout_gravity="center" android: layout_margin="10dp" android: scaleType="centerCrop" android: src="@drawable/ic_launcher"/> --> android: id="@+id/recyclerview" android: layout_width="match_parent" android: layout_height="100dp" android: layout_centerVertical="true" android: layout_gravity="bottom"/> 添加一个显示大图的区域,把RecyclerView改为自己定义的。 然后看我们自定义RecyclerView的代码: publicclassMyRecyclerViewextendsRecyclerView{ privateonItemScrollChangeListenermItemScrollChangeListener; privateViewmCurrentView; publicMyRecyclerView(Contextcontext,AttributeSetattrs){ super(context,attrs); //TODOAuto-generatedconstructorstub } //回调的接口 publicinterfaceonItemScrollChangeListener{ voidonChange(Viewview,intposition); } //对外暴露设置滚动接口的方法 publicvoidsetOnItemScrollChangeListener( onItemScrollChangeListeneritemScrollChangeListener){ this.mItemScrollChangeListener=itemScrollChangeListener; } @Override protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){ //TODOAuto-generatedmethodstub super.onLayout(changed,l,t,r,b); mCurrentView=getChildAt(0); if(mItemScrollChangeListener! =null){ mItemScrollChangeListener.onChange(mCurrentView, getChildPosition(mCurrentView)); } } @Override publicbooleanonTouchEvent(MotionEvente){ //TODOAuto-generatedmethodstub if(e.getAction()==MotionEvent.ACTION_MOVE){ mCurrentView=getChildAt(0); if(mItemScrollChangeListener! =null){ mItemScrollChangeListener.onChange(mCurrentView, getChildPosition(mCurrentView)); } } returnsuper.onTouchEvent(e); } } 最主要是重写onLayout,onTouchEvent方法,并设置滚动监听的回调,还有向外界暴露监听器的逻辑。 然后是Adapter的代码 pu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理解 Recyclerview 使用