RecyclerView用法基本解析

今天刚刚查看recyclerview用法,写了最简单的测试用法


首先,主布局,即为一个v7包下的 Recyclerview

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_text_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ht.testxyapp.com.testapp.activity.TextRecyclerViewActivity">

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

其次是  主Activity  adapter写在了activity里面


public class TextRecyclerViewActivity extends Activity {
    private RecyclerView rvView;
    private List<String> datas;
    private RvAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text_recycler_view);
        initDatas();
        rvView = (RecyclerView) findViewById(R.id.rvView);
        rvView.setLayoutManager(new LinearLayoutManager(this));
        rvView.addItemDecoration(new DividerItemDecoration(this,
                DividerItemDecoration.VERTICAL_LIST));
        adapter = new RvAdapter();
        rvView.setAdapter(adapter);
    }

    private void initDatas() {
        datas = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            datas.add(i + "**");
        }
    }

    private class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> {

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            MyViewHolder holder = new MyViewHolder(LayoutInflater.from(TextRecyclerViewActivity.this)
                    .inflate(R.layout.textrv_item, parent,false));
            return holder;
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.tv.setText(datas.get(position));
        }

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

        class MyViewHolder extends RecyclerView.ViewHolder {
            TextView tv;

            public MyViewHolder(View itemView) {
                super(itemView);
                tv = (TextView) itemView.findViewById(R.id.tv);
            }
        }
    }
}
现在就可以运行了,每个item是一个textview数字  看起来和listview一样,但是没有分隔线

想要增加分隔线,需要重写类继承ItemDecoration

如下

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 mDiliver;
    private int mOrientation;

    public DividerItemDecoration(Context context, int orientation) {
        final TypedArray ta = context.obtainStyledAttributes(ATTRS);
        mDiliver = ta.getDrawable(0);
        ta.recycle();


    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid exception");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        if (mOrientation == VERTICAL_LIST){
           drawHorizontal(c,parent);
        }else{
            drawVertical(c,parent);
        }
    }

    public void drawVertical(Canvas c,RecyclerView rv){
        final int left = rv.getPaddingLeft();
        final int right = rv.getWidth() - rv.getPaddingRight();

        final int childCount = rv.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = rv.getChildAt(i);
            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(rv.getContext());
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDiliver.getIntrinsicHeight();
            mDiliver.setBounds(left, top, right, bottom);
            mDiliver.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;
            final int right = left + mDiliver.getIntrinsicHeight();
            mDiliver.setBounds(left, top, right, bottom);
            mDiliver.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (mOrientation == VERTICAL_LIST){
            outRect.set(0,0,0,mDiliver.getIntrinsicHeight());
        }else{
            outRect.set(0,0,mDiliver.getIntrinsicWidth(),0);
        }
    }
}

写了之后,需要在主布局里面设置,添加

rvView.addItemDecoration(new DividerItemDecoration(this,
        DividerItemDecoration.VERTICAL_LIST));

现在运行项目已经有分隔线了,分割线是系统自带的线



如果想要自己定义分隔线样式,需要在项目values--styles中添加一个item即可   如

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

后面的@drawable/rv_drawable即为自己定义的drawable分隔线样式


如定义一个名为rv_drawable的横线shape,如下

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:centerColor="#ff00ff00"
        android:endColor="#ff0000ff"
        android:startColor="#ffff0000"
        android:type="linear" />
    <size android:height="4dp" />
</shape>
此时运行项目,分割线已经变为自定义的线了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值