Recycler介绍:RecyclerView是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView.
RecylerView和ListView的目的性其实都是去维护少量的View来展示大量的数据集,而RecyclerView的优点在于提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
- 如果你想要控制它的显示方式,就可以使用LayoutManager
- 如果你想要自定义item分割线,可以使用ItemDecoration
- 如果你想要item的增删动画,可以使用ItemAnimator
但是对于RecylerView来说,它并不像ListView一样直接给你提供了OnItemClickListener、OnItemClickLongListener这样的点击事件,以至于你想实现点击事件需要通过你自己来实现这些.下面我们就来谈一谈关于RecyclerView的基本使用吧.
添加依赖
dependencies {
compile 'com.android.support:recyclerview-v7:24.0.0'
.........
}
在XML布局中
<android.support.v7.widget.RecyclerView
android:id="@+id/mList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
没有什么特别的地方、和ListView一样
需要一个RecyclerView适配器
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.Demo>{
private String[] data;
private Context mContext;
public DemoAdapter(String[] datas, Context context){
this.data = datas;
mContext = context;
}
@Override
public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
return new Demo(rootView);
}
@Override
public void onBindViewHolder(Demo holder, int position) {
holder.imageView.setImageResource(R.drawable.back_default);
holder.textView.setText(data[position]);
}
@Override
public int getItemCount() {
return data.length;
}
class Demo extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
public Demo(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.iv_1);
textView = itemView.findViewById(R.id.tv_1);
}
}
}
比较简单的一个使用,在OnCreateViewHolder中创建视图,在onBindViewHolder中绑定视图数据,RecyclerView是自动复用视图的,所以不需要像listView中使用代码去做,当然你也可以手动来设置不复用,获取OnCreateViewHolder中创建出来的holder,holder.setIsRecyclable(false);
LayoutManager
其实SDK中自带了三种LayoutManager
- LinearLayoutManager
- GridLayoutManager
- StaggeredGridLayoutManager
分别是 - 线性布局:可以设置横向和纵向
- 网格布局:可以在设置多少行列、以及横向纵向
- 瀑布流布局
使用
以上这些必要的工作已经做好了吗,下面我们就来试一下RecyclerView的简单使用吧
RecyclerView mRecyclerView = findViewById(R.id.mListView)
mRecyclerView.setLayoutManager(new LinearLayoutManager(this))
mRecyclerView.setAdapter(new DemoAdapter(data,this))
这样就出现一个简单的RecyclerView列表
关于RecyclerView的点击事件
RecyclerView是没有像ListView那样很直白的点击事件的,这就需要我们自己来进行处理了,
我们可以在
@Override
public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
return new Demo(rootView);
}
这部分代码中、对rootView进行点击事件
rootView.setOnClickListener(new OnClickListener(){
………
})
那么我们怎么来传递当前的点到这个位置的值呢、我们并没有看到position这个参数
其实是可以的,看看怎么做
@Override
public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
Demo demo = new Demo(rootView);
int position = demo.getAdapterPosition()
return demo
}
这样就获取到了position,我们也可以在内部创建一个自己的监听接口、将点击的这个事件传递到外面,这样就可以做到和listView一样的写法,我就姑且不在这里做了。
结尾
剩下的还有一些自己来定义动画、自己定义layoutManger、分割线、以及使用中遇到的一些坑,我们下次再说