RececlerView

来源:互联网 发布:饥荒修改数据 编辑:程序博客网 时间:2024/06/10 08:53

1 RecyclerView 的简单使用
1 首先在android studio中添加依赖

compile 'com.android.support:recyclerview-v7:24.1.1'

2 在xml布局中引入控件

<android.support.v7.widget.RecyclerView        android:id="@+id/rv_divider"        android:layout_width="match_parent"        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

3自定义adapter
先继承RecyclerView.Adapter,并传入自定义的ViewHolder.并实现其抽象方法。

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder>

自定义ViewHolder,和以前ListView的Adapter类似。但是已经给集成好了,需要自己定义ViewHolder。然后通过泛型传给Adapter.

class MyViewHolder extends RecyclerView.ViewHolder {        TextView textView;        public MyViewHolder(View itemView) {            super(itemView);            textView = (TextView) itemView.findViewById(android.R.id.text1);        }    }

抽象方法01 构造MyViewHolder

 @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        MyViewHolder viewHolder = new MyViewHolder(View.inflate(parent.getContext(),android.R.layout.simple_list_item_1,null));        return viewHolder;    }

抽象方法02 和以前ListView的Adapter的getView方法类似。RecyclerView不能给item添加点击事件,所以这里只能自己添加点击回调。

    @Override    public void onBindViewHolder(MyViewHolder holder, final int position) {        holder.textView.setText(stringList.get(position));        holder.textView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                onItemClickListener.onItemClick(position);            }        });    }

抽象方法03 返回item的个数

   @Override    public int getItemCount() {        return stringList.size();    }

点击事件的回调

public interface OnItemClickListener {        void onItemClick(int position);    }

4 初始化recyclerView,给recyclerView设置布局管理器,设置adapter

 private void initView() {        recyclerView = (RecyclerView) findViewById(R.id.rv_divider);        //1 模拟假数据        for (int i = 0; i < 15; i++) {            stringList.add("item" + i);        }      //2 给recyclerView设置布局管理器       recyclerView.setLayoutManager(new GridLayoutManager(this, 3));       //3 设置adapter       recyclerView.setAdapter(new MyRecyclerViewAdapter(stringList, new MyRecyclerViewAdapter.OnItemClickListener() {            @Override            public void onItemClick(int position) {                Toast.makeText(DividerActivty.this, "点到我了!" + position, Toast.LENGTH_LONG).show();            }        }));        }

此时RecyclerView已经能显示出来。
上面这段代码的布局管理器就是给RecyclerView设置item的排列样式。比如设置成

   recyclerView.setLayoutManager(new GridLayoutManager(this, 3));

通过上面这一行RecyclerView就会以GridView的样式显示。同样也可以直接以线性排列的样式显示。线性排列默认的是垂直的。

 recyclerView.setLayoutManager(new LinearLayoutManager(this));

也可以设置成水平排列 true/false 是否从后往前显示

 recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true)); 

效果图
这里写图片描述

2 给RecyclerView设置分割线

1 自定义继承自RecyclerView.ItemDecoration的实现类。

GridViewDecoration extends RecyclerView.ItemDecoration

2 在构造方法中初始化Drawable对象 并把Drawable的属性赋值

 private Drawable mDivider;

系统的分割线属性

private int[] attrs = new int[]{android.R.attr.listDivider};

初始化mDIvider

 public GridViewDecoration(Context context) {        TypedArray typedArray = context.obtainStyledAttributes(attrs);        mDivider = typedArray.getDrawable(0);        typedArray.recycle();    }

3 实现抽象方法。

 @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        drawHorizontalLine(c, parent);        drawVerticalLine(c, parent);    }

在onDraw()方法中分别绘制水平和垂直方向的分割线。

//绘制水平间隔线    private void drawHorizontalLine(Canvas canvas, RecyclerView parent) {        int childCount = parent.getChildCount();        Log.i("Divider","childCount="+childCount);        for (int i = 0; i < childCount; i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();            int left = child.getLeft() - params.leftMargin;            int top = child.getBottom() + params.bottomMargin;            int right = child.getRight() + params.rightMargin;            int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(canvas);        }    }
 //绘制垂直间隔线    private void drawVerticalLine(Canvas canvas, RecyclerView parent) {        int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();            int left = child.getRight() + params.rightMargin;            int right = left + mDivider.getIntrinsicWidth();            int top = child.getTop() - params.topMargin;            int bottom = child.getBottom() + params.bottomMargin;            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(canvas);        }    }

这两断代码做法是一样的。首先是根据RecyclerView通过获取item,然后获取item的坐标,再根据item的坐标来计算出分割线的坐标。根据分割线的坐标来绘制分割线。
4 给RecyclerView设置分割线

private GridViewDecoration decor;
 decor = new GridViewDecoration(this); recyclerView.addItemDecoration(decor);

效果图
这里写图片描述

3 设置RecyclerView分割线的颜色和宽度

1 自定义方形的drawable xml文件

<shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">    <size        android:width="2dp"        android:height="2dp"></size>    <solid android:color="#F00"></solid></shape>

2 在主题样式中添加属性 引入上面的drawable

 <item name="android:listDivider">@drawable/item_divider</item>

效果图
这里写图片描述

0 0