一、概述
1.RecyclerView是什么?
RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。该控件用于在有限的窗口中展示大量数据集,它被作为ListView和GridView控件的继承者。RecyclerView高度解耦,异常灵活,通过设置不同LayoutManager,ItemDecoration , ItemAnimator实现令人想象不到的效果
2.RecyclerView怎么用?
既然RecyclerView的出现是为了要替换ListView和GridView,那么他们必有共通之处,,是的他们都是通过适配器来绑定数据的。
所以RecyclerView需要有如下东西支持:
1.Datas : 要显示的数据集合
2.Adapter:适配器,绑定数据集
3.ViewHolder:根据当前数据保存视图,其实就是列表数据的单个item布局
4.LayoutManager:布局管理者,决定列表数据摆放格式,是按照listview方式摆放还是按照gridview方式摆放,又或者是按照瀑布流方式,这就是Recyclerview强大的地方
5.ItemDecoration:列表的分割器,Recyclerview默认没有给我们提供分割线,需自定义,后续会给出代码
6.ItemAnimator: 当列表item被“添加”、“删除”,“位置变动”时执行什么动画,强大吧!
7.Listener: item事件监听,RecyclerView默认不提供OnItemClickListener 点击事件,需我们自定义,灵活使用。
二、RecyclerView的详细用法
1.适配器和普通的适配器不一样,需要继承RecyclerView.Adapter
2.listview使用时为了使用缓存,我们会定义一个ViewHolder类去存放布局控件,而RecyclerView 默认就支持这种方式,是不是更加方便了。
public class UserAdapter extends RecyclerView.Adapter { private List<UserBean> userBeanList; private Context mContext; public UserAdapter(Context context,List<UserBean> userBeanList){ mContext = context; this.userBeanList = userBeanList; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(mContext,R.layout.item_recycler_view,null); return new UserViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof UserViewHolder){ UserViewHolder userViewHolder = (UserViewHolder) holder; UserBean userBean = userBeanList.get(position); userViewHolder.name.setText(userBean.getName()); userViewHolder.number.setText(userBean.getNumber()); } } @Override public int getItemCount() { return userBeanList!=null?userBeanList.size():0; } class UserViewHolder extends RecyclerView.ViewHolder{ private TextView name; private TextView number; public UserViewHolder(View itemView) { super(itemView); init(itemView); //给列表item点击点击事件 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(itemClickListener!=null){ itemClickListener.onItemClick(v,getLayoutPosition()); } } }); } private void init(View view){ name = (TextView) view.findViewById(R.id.tv_name); number = (TextView) view.findViewById(R.id.tv_number); } } //对外部暴漏点击事件接口 public interface OnItemClickListener{ void onItemClick(View v,int position); } public OnItemClickListener itemClickListener; public void setItemClickListener(OnItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } }
运行效果:
源码地址:https://yunpan.cn/cu782gq6cEPD8 (提取码:a20d)