大概意思就是说:在有限大小的窗口里显示大量数据的一个灵活的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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)