RecyclerView 从配置到实现(eclipseandAndroidStudio )
前⾔
RecyclerView相较于ListView有更⾼的扩展性和可操作性,使⽤起来也更加灵活,但⽬前的IDE中还都需要引⼊RecyclerView的依赖包才能够使⽤,其中也是很多坑啊,因此,本篇将会介绍RecyclerView的配置和基本使⽤⽅法,以及期间可能遇到的问题。(PS:如果您是开发新项⽬,那么使⽤RecyclerView完全没问题;但如果是在旧项⽬中添加新功能,请⼀定考虑版本兼容性问题)
配置
AndroidStudio
在AndroidStudio中的配置还是⽐较简单的,毕竟官⽅亲⼉⼦,使⽤时只需要在adle中的dependencies内添加RecyclerView的依赖库即可,如下:
修改完成后会看到提⽰,要求sync now使改动⽣效,记得要这⼀步哦~
Eclipse
Eclipse中的配置则需要将sdk\extras\android\support\v7\recyclerview作为Android项⽬导⼊Eclipse,并在properties中设置为IsLibrary,再由项⽬引⼊才可以使⽤。配置过程如下:
导⼊recyclerview项⽬:
打开recyclerview的properties,在Android栏⾥选中IsLibrary:
dependencies{
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.straint:constraint-layout:1.0.0-alpha7'
testCompile 'junit:junit:4.12' }
再打开项⽬的properties,在Android栏⾥使⽤Add添加recyclerview项⽬作为依赖库:
⾄此,就可以在Eclipse的项⽬⾥正常使⽤RecyclerView啦!
可能遇到的问题
1. 仅导⼊了sdk\extras\android\support\v7\recyclerview\libs\android-support-v7-recyclerview.jar,这个jar包是不包含资源的,因此,导⼊后可以编译通过,但是⼀旦运⾏就会崩溃,正确⽅法如上所说,要导⼊整个项⽬作为依赖包;
2. 崩溃报错:
java.lang.Object android.support.v4.Bridge()’ on a null object reference
原因是V4包的版本与引⼊的RecyclerView包的版本不⼀致,具体的信息可以在项⽬的libs⽬录⾥以压缩包的形式打开android-support-v4.jar,查看META-INF/META-INF.MF中的Created-By,查看RecyclerView版本的⽅式相同,将v4包更换为
sdk\extras\android\support下相同的版本即可解决此问题。如下:
基本⽤法
RecyclerView的实现与ListView相似,以下三者缺⼀不可:
- Item内容类:即每个Item要展⽰的内容,例如图⽚的ImageId、TextView中要填充的内容等;
- Item布局⽂件: 决定了每个Item展⽰的布局样式;
- Adapter:适配器类,负责以上两者的绑定及事件处理等。
那接下来⼀ ⼀进⾏介绍。
怎么把项目导入到eclipseItem内容类
根据每个Item要展⽰的内容来定制我们需要的内容类,这⾥就先以简单的图⽚加⽂字的样式进⾏介绍。我们定义⼀个ItemContent的实体类,⾥⾯包含⼀个name 和 imageId:
public class ItemContent {
private String name;
private int imageId;
public ItemContent(String name, int imageId) {
this.name = name;
this.imageId = imageId;
}
public String getName(){
return name;
}
public int getImageId(){
return imageId;
}
}
Item布局⽂件
配置布局⽂件l,这个就不多介绍了,注意设置LinearLayout的orientation为horizontal,横向布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="schemas.android/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/item_image"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
Adapter适配器类
接下来要为RecyclerView设置⼀个适配器,不同于ListView,这⾥要继承于Recyclerview.Adapter,并将泛型指定为MyAdapter.ViewHolder,代码如下:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<ItemContent> mItemContentList;
public MyAdapter(List<ItemContent> ItemContentList) {
mItemContentList = ItemContentList;
}
static public class ViewHolder extends RecyclerView.ViewHolder{
ImageView itemImage;
TextView itemName;
public ViewHolder(View itemView) {
super(itemView);
itemImage = (ImageView)itemView.findViewById(R.id.item_image);
itemName = (TextView)itemView.findViewById(R.id.item_text);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.Context()).inflate(R.layout.item_layout,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ItemContent mContent = mItemContentList .get(position);
holder.itemImage.ImageId());
holder.itemName.Name());
}
@Override
public int getItemCount() {
return mItemContentList.size();
}
}
MyAdapter类咋⼀看很负载,但是我们来⼀ ⼀分析后会发现逻辑是很清晰的。⾸先
MyAdapter(List ItemContentList)构造函数将保存ItemContent类的List传⼊,⽤于内容提供。然后我们来看这个关键的内部类ViewHolder,虽然它包含很多东西,但是只要我们继承了RecyclerView.Adapter<MyAdapter.ViewHolder>,IDE会⾃动为我们添加这些⽅法的重写,因此不必刻意去记这些,但要知道每个⽅法的作⽤。
那么ViewHolder到底是什么呢?顾名思义,ViewHolder就是视图持有者,它⼿中掌管着每个Item视图的所有资源,在ViewHolder的构造函数中要传⼊⼀个view参数,这个参数就是RecyclerView⼦项的布局,通过这个view即可通过findviewbyId()来获取到布局中的控件实例了。
然后我们来看onCreateViewHolder、onBindViewHolder和getItemCount(),这三个⽅法是继承ViewH
older后必须重写的,IDE会⾃动帮我们添加。其中,onCreateViewHolder ⽅法⽤于创建ViewHolder实例,使⽤LayoutInflater将Item布局⽂件加载进来,并通过ViewHolder的构造函数创建⼀个实例,并将该实例返回;
当某个个Item滚动到屏幕内时,会触发onBindViewHolder来加载资源⽂件,通过position来确定Item位置和加载的资源对应,同时也可以在此处配置Item的事件监听和处理;
getItemCount()⽅法则是返回RecyclerView⼀共有多少⼦项,也就是mItemContentList的长度。
所以,回头看整个MyAdapter类,它的执⾏顺序是这样的:
构造函数MyAdapter()获取Item内容类 - - - -> onCreateViewHolder加载布局⽂件 - - - -> 构造函数ViewHolder获取控件实例 - - - -> Item滚动到屏幕内时触发onBindViewHolder⽅法,为Item中的控件加载资源。
⽽getItemCount()则是由⾃⼰调⽤运⾏的,这样⼀看逻辑就很清晰了。
l
主布局⽂件中通过完整的包路径引⽤RecyclerView:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论