Android之RecycleView使用(瀑布流管理器及线性流管理器)

    xiaoxiao2023-03-24  3

      首先我们先来了解一下RecycleView:

         RecycleView相对于原来的ListView和GridView要灵活很多,可以很快的在listView和gridView以及瀑布流之间进行切换,它主要提供了3中布局方式,LinearLayoutManager(ListView)、GridLayoutManager(GridView)、StaggeredGridLayoutManager(瀑布流)。

        RecyclerView比ListView,GridView之类控件都有哪些优点:

    1、数据绑定2、Item View创建3、View的回收以及重用等机制。        下面我们来介绍一下RecycleView瀑布流的用法  一、我们需要一个瀑布流的工具类   DividerItemDecoration.java     /*瀑布流 * */ public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final 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 + Math.round(ViewCompat.getTranslationY(child)); final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); 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 left = child.getRight() + params.rightMargin + Math.round(ViewCompat.getTranslationX(child)); final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } } 二、我们来建一个Activity    RecyclerActivity.java         先来看一下布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.edu.jereh.android14.recyclerlistview.RecyclerActivity"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rv" ></android.support.v7.widget.RecyclerView> </RelativeLayout>三、我们来看一下 具体代码的写法: public class RecyclerActivity extends Activity { @Bind(R.id.rv) RecyclerView rv; private List<Map> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler); ButterKnife.bind(this); list =new ArrayList<>(); initDate(); MyAdapter myAdapter =new MyAdapter(list); //瀑布流管理器 StaggeredGridLayoutManager sgm = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); rv.setLayoutManager(sgm); rv.setAdapter(myAdapter); //设置分割线 DividerItemDecoration itemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST); rv.addItemDecoration(itemDecoration); } public void initDate(){ HashMap map =new HashMap(); map.put("img",R.mipmap.a); map.put("text","x1"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.b); map.put("text","x2"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.as); map.put("text","x3"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.e); map.put("text","x2"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.e); map.put("text","x3"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.as); map.put("text","x2"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.lh3); map.put("text","x3"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.b); map.put("text","x2"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.as); map.put("text","x3"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.lh1); map.put("text","x2"); list.add(map); map=new HashMap(); map.put("img",R.mipmap.lh2); map.put("text","x3"); list.add(map); } public class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{ private List<Map> mapList; public MyAdapter(List<Map> mapList) { this.mapList = mapList; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view=LayoutInflater.from(getBaseContext()).inflate(R.layout.recycle_stag,parent,false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } //绑定 @Override public void onBindViewHolder(MyViewHolder holder, int position) { Map map = mapList.get(position); holder.imageView.setImageResource((Integer) map.get("img")); holder.textView.setText(map.get("text").toString()); } @Override public int getItemCount() { return mapList.size(); } } public class MyViewHolder extends RecyclerView.ViewHolder{ ImageView imageView; TextView textView; public MyViewHolder(View itemView) { super(itemView); imageView=(ImageView)itemView.findViewById(R.id.iv); textView =(TextView)itemView.findViewById(R.id.tvi1); } } } 下面是效果图     
    转载请注明原文地址: https://ju.6miu.com/read-1201699.html
    最新回复(0)