一、概述
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)