![【移动应用开发技术】RecyclerView怎么在Android中使用_第1页](http://file4.renrendoc.com/view/dcb1ec51956780a25c81815d30fad2c3/dcb1ec51956780a25c81815d30fad2c31.gif)
![【移动应用开发技术】RecyclerView怎么在Android中使用_第2页](http://file4.renrendoc.com/view/dcb1ec51956780a25c81815d30fad2c3/dcb1ec51956780a25c81815d30fad2c32.gif)
![【移动应用开发技术】RecyclerView怎么在Android中使用_第3页](http://file4.renrendoc.com/view/dcb1ec51956780a25c81815d30fad2c3/dcb1ec51956780a25c81815d30fad2c33.gif)
![【移动应用开发技术】RecyclerView怎么在Android中使用_第4页](http://file4.renrendoc.com/view/dcb1ec51956780a25c81815d30fad2c3/dcb1ec51956780a25c81815d30fad2c34.gif)
![【移动应用开发技术】RecyclerView怎么在Android中使用_第5页](http://file4.renrendoc.com/view/dcb1ec51956780a25c81815d30fad2c3/dcb1ec51956780a25c81815d30fad2c35.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】RecyclerView怎么在Android中使用
RecyclerView怎么在Android中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先ListView与RecyclerView两者非常相似,两者提供view都是依赖适配器。只不过就是5.0版本推出RecyclerView后,Google将adapter和viewHolder做了一系列的优化和封装。不像之前为了复用Listview里面的converView,要类似在getView里面实现下列的代码:上面代码看起来挺眼熟吧~二、对比RecyclerView,google进行的优化在RecyclerView依赖的适配器中,无论是适配器还是ViewHolder,从源码我们可以看出,都存在RecyclerView的匿名内部类。相对于Listview,RecyclerView内置了多级缓存、RecyclerViewPool(从线程的角度,可以理解成类似线程池的东西,即多个RecyclerView可以公用一个view)、ViewHolder(已经实现了复用,相对于Listview的BaseAdapter中getView方法需要开发者自己引入复用问题方便很多)等等。这里我们简单说下两个方法:public
ViewHolder
onCreateViewHolder(ViewGroup
parent,
int
viewType)public
void
onBindViewHolder(ViewHolder
holder,
int
position)在以前的BaseAdapter中,所有视图加载、数据绑定以及复用,都需要我们直接在getView里面进行操作。onCreateViewHolder负责视图加载并且内部完成复用,onBindViewHolder负责数据绑定并且内部完成一系列的缓存机制。这里满足了视图层与逻辑层的分离,典型的mvp模式。三、RecyclerView的头部与尾部实现RecyclerView不像ListView拥有addHeaderView()与addFooterView()的方法简单添加头部尾部即可,而且RecyclerView也没有像ListView的列表点击监听方法(setItemOnclickListener),这里我也不明白为什么官方会取消了这些独有的属性,不过我们依然可以在onBindViewHolder方法中进行事件绑定!具体头部与尾部实现方法,这里有个诀窍,这里先看一个方法:public
int
getItemViewType(int
position)getItemViewType方法是在执行onCreateViewHolder(ViewGroupparent,intviewType)前回调用viewType,目的是为了根据viewType不同创建不同的视图。我们可以通过在onCreateViewHolder创建视图的时候,对viewType进行判断,如果添加了头部,在position=0的时候回调头部的viewType给onCreateViewHolder,从而创建头部。尾部创建方法于此类同,直接看下代码,适配器的实现:package
cn.wsy.recyclerdemo;
import
android.content.Context;
import
android.support.v7.widget.GridLayoutManager;
import
android.support.v7.widget.RecyclerView;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.TextView;
import
java.util.ArrayList;
import
java.util.List;
/**
*
Created
by
wsy
on
2016/8/4.
*/
public
class
MyAdapter
extends
RecyclerView.Adapter<MyAdapter.MyHolder>
{
private
RecyclerView
mRecyclerView;
private
List<String>
data
=
new
ArrayList<>();
private
Context
mContext;
private
View
VIEW_FOOTER;
private
View
VIEW_HEADER;
//Type
private
int
TYPE_NORMAL
=
1000;
private
int
TYPE_HEADER
=
1001;
private
int
TYPE_FOOTER
=
1002;
public
MyAdapter(List<String>
data,
Context
mContext)
{
this.data
=
data;
this.mContext
=
mContext;
}
@Override
public
MyAdapter.MyHolder
onCreateViewHolder(ViewGroup
parent,
int
viewType)
{
if
(viewType
==
TYPE_FOOTER)
{
return
new
MyHolder(VIEW_FOOTER);
}
else
if
(viewType
==
TYPE_HEADER)
{
return
new
MyHolder(VIEW_HEADER);
}
else
{
return
new
MyHolder(getLayout(R.layout.item_list_layout));
}
}
@Override
public
void
onBindViewHolder(MyHolder
holder,
int
position)
{
if
(!isHeaderView(position)
&&
!isFooterView(position))
{
if
(haveHeaderView())
position--;
TextView
content
=
(TextView)
holder.itemView.findViewById(R.id.item_content);
TextView
time
=
(TextView)
holder.itemView.findViewById(R.id.item_time);
content.setText(data.get(position));
time.setText("2016-1-1");
}
}
@Override
public
int
getItemCount()
{
int
count
=
(data
==
null
?
0
:
data.size());
if
(VIEW_FOOTER
!=
null)
{
count++;
}
if
(VIEW_HEADER
!=
null)
{
count++;
}
return
count;
}
@Override
public
int
getItemViewType(int
position)
{
if
(isHeaderView(position))
{
return
TYPE_HEADER;
}
else
if
(isFooterView(position))
{
return
TYPE_FOOTER;
}
else
{
return
TYPE_NORMAL;
}
}
@Override
public
void
onAttachedToRecyclerView(RecyclerView
recyclerView)
{
try
{
if
(mRecyclerView
==
null
&&
mRecyclerView
!=
recyclerView)
{
mRecyclerView
=
recyclerView;
}
ifGridLayoutManager();
}
catch
(Exception
e)
{
e.printStackTrace();
}
}
private
View
getLayout(int
layoutId)
{
return
LayoutInflater.from(mContext).inflate(layoutId,
null);
}
public
void
addHeaderView(View
headerView)
{
if
(haveHeaderView())
{
throw
new
IllegalStateException("hearview
has
already
exists!");
}
else
{
//避免出现宽度自适应
ViewGroup.LayoutParams
params
=
new
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
headerView.setLayoutParams(params);
VIEW_HEADER
=
headerView;
ifGridLayoutManager();
notifyItemInserted(0);
}
}
public
void
addFooterView(View
footerView)
{
if
(haveFooterView())
{
throw
new
IllegalStateException("footerView
has
already
exists!");
}
else
{
ViewGroup.LayoutParams
params
=
new
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
footerView.setLayoutParams(params);
VIEW_FOOTER
=
footerView;
ifGridLayoutManager();
notifyItemInserted(getItemCount()
-
1);
}
}
private
void
ifGridLayoutManager()
{
if
(mRecyclerView
==
null)
return;
final
RecyclerView.LayoutManager
layoutManager
=
mRecyclerView.getLayoutManager();
if
(layoutManager
instanceof
GridLayoutManager)
{
final
GridLayoutManager.SpanSizeLookup
originalSpanSizeLookup
=
((GridLayoutManager)
layoutManager).getSpanSizeLookup();
((GridLayoutManager)
layoutManager).setSpanSizeLookup(new
GridLayoutManager.SpanSizeLookup()
{
@Override
public
int
getSpanSize(int
position)
{
return
(isHeaderView(position)
||
isFooterView(position))
?
((GridLayoutManager)
layoutManager).getSpanCount()
:
1;
}
});
}
}
private
boolean
haveHeaderView()
{
return
VIEW_HEADER
!=
null;
}
public
boolean
haveFooterView()
{
return
VIEW_FOOTER
!=
null;
}
private
boolean
isHeaderView(int
position)
{
return
haveHeaderView()
&&
position
==
0;
}
private
boolean
isFooterView(int
position)
{
return
haveFooterView()
&&
position
==
getItemCount()
-
1;
}
public
static
class
MyHolder
extends
RecyclerView.ViewHolder
{
public
MyHolder(View
itemView)
{
super(itemView);
}
}
}四、实现方法简单的初始化RecycerView,以及设置适配器,如下:
private
void
initRecyc()
{
//
mRecyclerView.setLayoutManager(new
GridLayoutManager(this,2));
mRecyclerView.setLayoutManager(new
LinearLayoutManager(this));
adapter
=
new
MyAdapter(data,
this);
mRecyclerView.setAdapter(adapter);
adapter.addFooterView(LayoutInflater.from(this).inflate(R.layout.item_footer_layout,null));
adapter.addHeaderView(LayoutInflater.from(this).inflate(R.layout.item_header_layout,null));
}五、注意的问题笔者在添加头部尾部的时候,发现在配置RecyclerView,如果模式是配置GridLayoutManager的时候,发现头部会跑到第一格,也就是不是自己想要独立一行的效果,这里
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论