Android RecyclerView线性布局详解(1)

Android RecyclerView线性布局详解(1),第1张

概述RecyclerView是Android5.0新增的控件,在android-support-v7下面。官方文档对RecycleView介绍很简洁到位,如下: @H_301_0@RecyclerVIEw是AndroID 5.0新增的控件,在androID-support-v7下面。官方文档对RecycleVIEw介绍很简洁到位,如下:

@H_301_0@A flexible vIEw for provIDing a limited window into a large data set.
大概意思就是说:在有限大小的窗口里显示大量数据的一个灵活的vIEw。

@H_301_0@下面是ReccleVIEw继承图:

@H_301_0@看到这里我们自然想到了与之类似的控件ListVIEw,RecyclerVIEw和ListVIEw都是在有限的屏幕区域里维护少量的VIEw来进行显示大量的数据,其实RecyclerVIEw是ListVIEw的升级版,功能更加强大,更加灵活,扩展性更强,Google建议使用RecycleVIEw替代ListVIEw。

@H_301_0@下面是RecycleVIEw结构图:

@H_301_0@RecycleVIEw主要包括以下几个部件:

@H_301_0@1. RecyclerVIEw.Adapter

@H_301_0@数据和视图的分离设计是程序解耦和可维护的重要指标,RecycleVIEw作为展示大量数据的vIEw肯定是遵循这个设计的,ListVIEw也不例外。通过继承RecycleVIEw.Adapter即可轻松实现自己的adapter,主要重写RecycleVIEw.Adapter的下面三个方法即可实现:

public MyRecycleVIEwAdapter.MyVIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) public voID onBindVIEwHolder(MyRecycleVIEwAdapter.MyVIEwHolder holder,int position)public int getItemCount() 
@H_301_0@上面MyRecycleVIEwAdapter是我自己定义的VIEwHolder

@H_301_0@2. VIEwHolder

@H_301_0@VIEwHolder用来保存列表中item vIEw引用的类,这样做的目的是重用item视图,从而提高性能。
在ListVIEw中,VIEwHolder不是ListVIEw自带的,是需要自己定义的,当然你也可以不使用VIEwHolder,这样的后果就是ListVIEw每次调用getVIEw()方法的时候都会调用findVIEwByID()方法,要知道findVIEwByID()性能很差,它通过递归的方式去从vIEw树中找特定的子vIEw的,最终往往带来很差的性能体验,所以使用VIEwHolder也成了优化ListVIEw最重要的手段。
在RecyclerVIEw中,AndroID内置了RecyclerVIEw.VIEwHolder,这意味着VIEwHolder使用成了必须。

@H_301_0@3. 分割线 RecycleVIEw.Itemdecoration

@H_301_0@ListVIEw添加分割线很简单,只需在ListVIEw的xml中配置”divIDer”属性即可,如:

androID:divIDerHeight="2dp"androID:divIDer="@color/red"
@H_301_0@但RecycleVIEw添加分割线是比较麻烦的,并且默认是不带分割线的。但实际开发中一般都需要分割线,使用RecycleVIEw.Itemdecoration为RecycleVIEw添加分割线

@H_301_0@4. 布局管理器 LayoutManager

@H_301_0@RecycleVIEw支持多种布局模式:

@H_301_0@1、linearlayoutmanager
线性布局管理器,支持水平布局和垂直布局两种
2、GrIDLayoutManager
网格布局管理器
3、StaggerdGrIDLayoutManager
错列的网格布局管理器,可以实现瀑布流列表

@H_301_0@RecycleVIEw使用时和ListVIEw很类似,直接看一个简单的例子,分别展示一个垂直方向和水平方向上的列表,并且都支持使用颜色和图片做分割线,效果图如下:

@H_301_0@1. MainActivity

@H_301_0@

package com.cjl.recyclevIEwtest;...public class MainActivity extends AppCompatActivity { private VerticalFragment mVerticalFragment; private HorizontalFragment mHorizontalFragment; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); //垂直 mVerticalFragment = new VerticalFragment(); //水平 mHorizontalFragment = new HorizontalFragment(); //默认为设置垂直 getFragmentManager().beginTransaction().replace(R.ID.activity_main,mVerticalFragment).commit(); } @OverrIDe public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_recyclevIEw,menu); return super.onCreateOptionsMenu(menu); } @OverrIDe public boolean onoptionsItemSelected(MenuItem item) { int ID = item.getItemID(); switch (ID) {  //垂直方向  case R.ID.vertical:  VerticalFragment mVerticalFragment = new VerticalFragment();  getFragmentManager().beginTransaction().replace(R.ID.activity_main,mVerticalFragment).commit();  break;  //水平方向  case R.ID.horizontal: getFragmentManager().beginTransaction().replace(R.ID.activity_main,mHorizontalFragment).commit();  break; } return super.onoptionsItemSelected(item); }}
@H_301_0@MainActivity布局文件 R.layout.activity_main

<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:ID="@+ID/activity_main" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"></FrameLayout>
@H_301_0@2. 垂直方向上 VerticalFragment

@H_301_0@

public class VerticalFragment extends Fragment implements VIEw.OnClickListener{ private RecyclerVIEw mRecycleVIEwDrawable; private RecyclerVIEw mRecycleVIEwcolor; private linearlayoutmanager mManagercolor; private linearlayoutmanager mManagerDrawable; private List<String> mData; private button mDrawable; private button mcolor; private MyRecycleVIEwAdapter mRecycleVIEwAdapter; @Nullable @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) { VIEw vIEw = inflater.inflate(R.layout.fragment_vertical_layout,container,false); mRecycleVIEwDrawable = (RecyclerVIEw) vIEw.findVIEwByID(R.ID.recyclevIEw_drawable); mRecycleVIEwcolor = (RecyclerVIEw) vIEw.findVIEwByID(R.ID.recyclevIEw_color); mDrawable = (button) vIEw.findVIEwByID(R.ID.btn_drawable); mDrawable.setonClickListener(this); mcolor = (button) vIEw.findVIEwByID(R.ID.btn_color); mcolor.setonClickListener(this); //1. 颜色分割线 mManagercolor = new linearlayoutmanager(getActivity()); mManagercolor.setorIEntation(linearlayoutmanager.VERTICAL); mRecycleVIEwcolor.setLayoutManager(mManagercolor); //设置颜色分割线 mRecycleVIEwcolor.addItemdecoration(new lineardivIDer(getActivity(),linearlayoutmanager.VERTICAL,10,this.getResources().getcolor(R.color.colorAccent))); //2. 图片分割线 mManagerDrawable = new linearlayoutmanager(getActivity()); mManagerDrawable.setorIEntation(linearlayoutmanager.VERTICAL); mRecycleVIEwDrawable.setLayoutManager(mManagerDrawable); //设置图片分割线 Drawable drawable = ContextCompat.getDrawable(getActivity(),R.mipmap.divIDer); mRecycleVIEwDrawable.addItemdecoration(new lineardivIDer(getActivity(),20,drawable)); mData = new ArrayList<String>(); initData(mData); //自定义adapter mRecycleVIEwAdapter = new MyRecycleVIEwAdapter(getActivity(),R.layout.item_vertical_recyclevIEw,mData); //设置adapter mRecycleVIEwcolor.setAdapter(mRecycleVIEwAdapter); mRecycleVIEwDrawable.setAdapter(mRecycleVIEwAdapter); return vIEw; } private voID initData(List<String> dataList) { for (int i = 0; i < 30; i++) {  dataList.add("item" + i); } } @OverrIDe public voID onClick(VIEw vIEw) { int ID = vIEw.getID(); switch (ID){  case R.ID.btn_drawable:  mRecycleVIEwcolor.setVisibility(VIEw.INVISIBLE);  mRecycleVIEwDrawable.setVisibility(VIEw.VISIBLE);  break;  case R.ID.btn_color:  mRecycleVIEwcolor.setVisibility(VIEw.VISIBLE);  mRecycleVIEwDrawable.setVisibility(VIEw.INVISIBLE);  break; } }}
@H_301_0@VerticalFragment 的布局文件 R.layout.fragment_vertical_layout

@H_301_0@

<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <androID.support.v7.Widget.RecyclerVIEw androID:ID="@+ID/recyclevIEw_drawable" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layout_marginBottom="60dp"/> <androID.support.v7.Widget.RecyclerVIEw androID:ID="@+ID/recyclevIEw_color" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layout_marginBottom="60dp" androID:visibility="invisible"/> <linearLayout androID:ID="@+ID/lilayout" androID:orIEntation="horizontal" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:weightSum="2" androID:layout_alignParentBottom="true"> <button  androID:ID="@+ID/btn_drawable"  androID:layout_wIDth="wrap_content"  androID:layout_height="50dp"  androID:text="图片分割线"  androID:gravity="center"  androID:layout_weight="1"  androID:background="@color/colorPrimary"/> <button  androID:ID="@+ID/btn_color"  androID:layout_wIDth="wrap_content"  androID:layout_height="50dp"  androID:text="颜色分割线"  androID:gravity="center"  androID:layout_weight="1"  androID:background="@color/mytv"/> </linearLayout></relativeLayout>
@H_301_0@3. 直接继承RecyclerVIEw.Adapter

public class MyRecycleVIEwAdapter extends RecyclerVIEw.Adapter<MyRecycleVIEwAdapter.MyVIEwHolder> { private LayoutInflater mLayoutInflater; private List<String> mDataList; private int mItemLayout; public MyRecycleVIEwAdapter(Context context,int itemLayout,List<String> dataList) { mLayoutInflater = LayoutInflater.from(context); mItemLayout = itemLayout; mDataList = dataList; } @OverrIDe public MyRecycleVIEwAdapter.MyVIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) { return new MyVIEwHolder(mLayoutInflater.inflate(mItemLayout,parent,false)); } @OverrIDe public voID onBindVIEwHolder(MyRecycleVIEwAdapter.MyVIEwHolder holder,int position) { holder.mTextVIEw.setText(mDataList.get(position)); } @OverrIDe public int getItemCount() { return mDataList.size(); } class MyVIEwHolder extends RecyclerVIEw.VIEwHolder { private TextVIEw mTextVIEw; public MyVIEwHolder(VIEw itemVIEw) {  super(itemVIEw);  mTextVIEw = (TextVIEw) itemVIEw.findVIEwByID(R.ID.tv); } }}
@H_301_0@item布局文件 item_vertical_recyclevIEw.xml

<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content"> <TextVIEw androID:ID="@+ID/tv" androID:gravity="center" androID:layout_wIDth="match_parent" androID:layout_height="60dp"/></FrameLayout>
@H_301_0@4. 分割线 RecyclerVIEw.Itemdecoration

public class lineardivIDer extends RecyclerVIEw.Itemdecoration { private Drawable mdivIDerDarwable; private int mOrIEntation; private int mdivIDerHight = 1; private Paint mcolorPaint; public final int[] ATRRS = new int[]{  androID.R.attr.ListdivIDer }; /* orIEntation 方向 */ public lineardivIDer(Context context,int orIEntation) { final TypedArray ta = context.obtainStyledAttributes(ATRRS); this.mdivIDerDarwable = ta.getDrawable(0); ta.recycle(); setorIEntation(orIEntation); } /* int orIEntation 方向 int divIDerHight 分割线的线宽 Drawable divIDerDrawable 充当分割线的图片 */ public lineardivIDer(Context context,int orIEntation,int divIDerHight,Drawable divIDerDrawable) { this(context,orIEntation); mdivIDerHight = divIDerHight; mdivIDerDarwable = divIDerDrawable; } /* int orIEntation 方向 int divIDerHight 分割线的线宽 int divIDercolor 分割线的颜色 */ public lineardivIDer(Context context,int divIDercolor) { this(context,orIEntation); mdivIDerHight = divIDerHight; mcolorPaint = new Paint(); mcolorPaint.setcolor(divIDercolor); } public voID setorIEntation(int orIEntation) { if (orIEntation != linearlayoutmanager.HORIZONTAL && orIEntation != linearlayoutmanager.VERTICAL) {  throw new IllegalArgumentException("方向参数错误!"); } mOrIEntation = orIEntation; } @OverrIDe public voID onDraw(Canvas c,RecyclerVIEw parent,RecyclerVIEw.State state) { super.onDraw(c,state); if (mOrIEntation == linearlayoutmanager.HORIZONTAL) {  drawHorizontaldivIDer(c,parent); } else {  drawVirticaldivIDer(c,parent); } } //画垂直分割线 public voID drawVirticaldivIDer(Canvas c,RecyclerVIEw parent) { int left = parent.getpaddingleft(); int right = parent.getWIDth() - parent.getpaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) {  final VIEw child = parent.getChildAt(i);  final RecyclerVIEw.LayoutParams params = (RecyclerVIEw.LayoutParams) child.getLayoutParams();  final int top = child.getBottom() + params.bottommargin;  final int bottom = top + mdivIDerHight;  if (mdivIDerDarwable != null) {  mdivIDerDarwable.setBounds(left,top,right,bottom);  mdivIDerDarwable.draw(c);  }  if (mcolorPaint != null) {  c.drawRect(left,bottom,mcolorPaint);  } } } //画水平分割线 public voID drawHorizontaldivIDer(Canvas c,RecyclerVIEw parent) { int top = parent.getpaddingtop(); int bottom = parent.getHeight() - parent.getpaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) {  final VIEw child = parent.getChildAt(i);  RecyclerVIEw.LayoutParams params = (RecyclerVIEw.LayoutParams) child.getLayoutParams();  final int left = child.getRight() + params.rightmargin;  final int right = left + mdivIDerHight;  if (mdivIDerDarwable != null) {  mdivIDerDarwable.setBounds(left,mcolorPaint);  } } } @OverrIDe public voID getItemOffsets(Rect outRect,VIEw vIEw,RecyclerVIEw.State state) { super.getItemOffsets(outRect,vIEw,state); if (mOrIEntation == linearlayoutmanager.HORIZONTAL) {  outRect.set(0,mdivIDerHight); } else {  outRect.set(0,mdivIDerHight,0); } }}
@H_301_0@未完待续……

@H_301_0@以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android RecyclerView线性布局详解(1)全部内容,希望文章能够帮你解决Android RecyclerView线性布局详解(1)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1146872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存