RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。
RecyclerView可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。
RecyclerView 基本用法:
1、添加依赖库
因为RecyclerView属于新增的控件,Android将RecyclerView定义在support库里。若要使用RecyclerView,第一步是要在build.gradle中添加对应的依赖库:
2、在xml布局文件中使用控件
由于RecyclerView不是内置在系统SDK中,需要把其完整的包名路径写出来:
3、布局管理器
Recycler View有三种布局管理器,分别是:线性、网格、交错网格;设置布局管理器使用 setLayoutManager() 方法。
//1、线性布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//默认为竖直排列,HORIZONTAL:横向滚动,需要将item里的布局长度固定,否则将会填充整个布局
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager); //线性
// 2、网格布局管理器,参数3:网格的列数
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
recyclerView.setLayoutManager(gridLayoutManager);//网格
// 3、交错网格布局管理器,参数第一个是布局的列数,第二个是布局的排列方向
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);//交错网格布局
4、自定义适配器
1、定义类继承RecyclerView.ViewHolder类:用于绑定子项布局,并初始化控件。
public static class RecyclerViewHolder extends RecyclerView.ViewHolder {
View view;
public ImageView imavPic;
public TextView tvUrl;
public RecyclerViewHolder(View itemView) {
super(itemView);
view = itemView;
imavPic = (ImageView) view.findViewById(R.id.imavPic);
tvUrl = (TextView) view.findViewById(R.id.tvUrl);
}
}
2、定义类继承RecyclerView.Adapter,重写onCreateViewHolder(),onBindViewHolder()和getItemCount()三个方法。
- onCreateViewHolder():用于创建ViewHolder实例,并把加载的布局传入到构造函数去,再把ViewHolder实例返回。
- onBindViewHolder():用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行,position得到当前项的实例。
- getItemCount():返回RecyclerView的子项数。
public class RecyclerAdapter extends android.support.v7.widget.RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {
int[] picUrls;
Context c;
public RecyclerAdapter(Context c, int[] picUrls) {
this.picUrls = picUrls;
this.c = c;
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
final RecyclerViewHolder holder = new RecyclerViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
holder.imavPic.setImageResource(picUrls[position]);
holder.tvUrl.setText(picUrls[position]);
}
@Override
public int getItemCount() { // 返回数据有多少条
if (null == picUrls)
return 0;
return picUrls.length;
}
}
3、点击事件
在自定义适配器类的onCreateViewHolder()方法中,为子项内控件添加点击事件。
holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
Toast.makeText(view.getContext(), "you clicked view " + position
, Toast.LENGTH_SHORT).show();
}
});
holder.imavPic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
Toast.makeText(view.getContext(), "you clicked image " + position
, Toast.LENGTH_SHORT).show();
}
});
~~~~~~~~~~~~~ 学习笔记,欢迎交流 ~~~~~~~~~~~~~