# RecyclerViewTest **Repository Path**: charming-c/RecyclerViewTest ## Basic Information - **Project Name**: RecyclerViewTest - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RecyclerView的简单介绍 * ## 1.添加依赖包: - 有两种方法 1.在gradle的文件中直接导入依赖 2.在项目的Project Structure的Libraries搜索相关的依赖包 - ## 2.写写相关的xml文件 主要就是recyclerview的控件以及recyclerview里每个单位,每一个条目的布局。reclerview实际就是很多item按照一定的样式拼凑在一起的布局。具体每个item(条目)的布局,要单独编辑。注意不要把item的layout_height写成match_parent,不然会造成屏幕滑动,item回收以后,每个item填充整个屏幕,造成条目之间的空白非常大。 - ## 3.创建适配器 ``` public class ListViewAdapter extends RecyclerView.Adapter ``` ### 标准的实现步骤如下: #### 1.创建具体的Adapter类: - 创建一个继承RecyclerView.Adapter的Adapter类(VH是具体的viewholder的类名) #### 2.创建ViewHolder: - 在Adapter中创建一个继承自RecyclerView.ViewHolder的静态内部类。 #### 3.重写继承自Adapter中的三个方法: - onCreateViewHolder() 这个主要是为每一个item 绑定出一个view,但是此方法返回的是一个ViewHolder。该方法使得View直接封装在ViewHolder中。也就是说这个方法会创建一个具体的item(条目)。 ``` public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext()); View view=layoutInflater.inflate(R.layout.item,parent,false); return new InnerHolder(view); } ``` - onBindViewHolder(vh,position) 一般用来给每个item设置具体的数据。 - getItemCount() 这个方法可以返回Recyclerview的显示的条目个数。 ``` public int getItemCount() { if(mData!=null){ return mData.size(); } else return 0; } ``` *item里的各个组件的实例化应该放在ViewHolder这个静态内部类中实现* - ## 4.设置recyclerview 创建完Adapter,接着对RecyclweView进行设置,一般来说有四大设置: - LayoutManager(必选) - Adapter(必选) - Item Decoration(可选泽性设置,默认为空) - Item Animator(可选,默认DefaultItemAnimator) ### LayoutManager布局管理器 LayoutManager用于控制recyclerview的最终展示效果,他控制了item的排布,包含了Item'View的回收和获取。 RecyclerView有**三种布局管理器** - LinearLayoutManager 以垂直或水平列表的方式展示Item - GradLayoutManager 以网格的方式展示item - StaggeredGridLayoutManager 以瀑布流方式展示Item ``` StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, VERTICAL); mLinearLayoutManager = new LinearLayoutManager(getActivity()); ``` ### Adapter适配器 上面已经讲过了,只需要最后用recyclerview使用一下setAdapter(Adapter)方法就可以了 ### ItemDecoration 间隔样式和Item Animator 动画效果 Recyclerview通过`addItemDecoration()`方法添加item之间的分割线。Android并没有提供实现好的Divider,因此任何分割式都要自己实现。 - #### onDraw(Canvas c,RecyclerView parent,State state) 在Item被绘制之前调用,此方法主要用于绘制间隔样式 - #### onDrawOver(Canvas c,RecyclerView parent,State state) 在Item被绘制之前调用,此方法主要用于绘制间隔样式 - #### getItemOffsets(Rect outRest, View view ,RecyclerView recyclerview,State state),设置item的偏离量,偏移部分填充间隔样式,即设置分割线的宽高,在RecyclerView的onMesure()中调用。 具体实现起来有点麻烦,我建议直接在itemiew的xml文件外面直接套一个CardView,又简单又美观(需要先加依赖) - ## 点击事件的添加 RecyclerView并没有专门点击事件的监听器,需要自己实现。 可以通过绑定ViewHolder的时候设置监听,在使用Adpater回调出去 ``` public void onBindViewHolder(@NonNull StaggerAdapter.InnerHolder holder, final int position) { holder.setData(mData.get(position)); if(mOnItemClickListener!=null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(position); } }); } } public void setOnItemClickListener(OnItemClickListener listener) { //设置一个监听器,其实就是设置一个回调的接口 this.mOnItemClickListener=listener; } public interface OnItemClickListener{ void onItemClick(int position); } ``` ## 注意: 在设置瀑布流的RecyclerView时,是需要有两个或者多个itemView的,因为瀑布流里面item的大小不一,可以在ItemView绑定View时使用不同的布局达到瀑布流的效果 @Override public int getItemViewType(int position) { // 瀑布流样式外部设置spanCount为2,在这列设置两个不同的item type,以区分不同的布局 return position % 2; } @Override public MDStaggeredRvAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 实例化展示的view View v; if(viewType == 1) { v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rv_staggered_item, parent, false); } else { v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rv_staggered_item_two, parent, false); } // 实例化viewholder ViewHolder viewHolder = new ViewHolder(v); return viewHolder; } ```