Android RecyclerView ItemDecoration divider line with drawable

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/85054065
package zhangphil.book;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView mRecyclerView = findViewById(R.id.recycler_view);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(linearLayoutManager);

        RecyclerViewAdapter adapter = new RecyclerViewAdapter();
        mRecyclerView.setAdapter(adapter);

        RVItemDecoration mRVItemDecoration = new RVItemDecoration(getApplicationContext());
        mRVItemDecoration.setDividerHeight(100);//分割线高度100pix。
        mRVItemDecoration.setDividerMargin(10, 10, 0, 10);//分割线里面的内容距离四周的margin值。
        mRecyclerView.addItemDecoration(mRVItemDecoration);
    }

    private class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
        @NonNull
        @Override
        public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(getApplicationContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
            RecyclerViewHolder holder = new RecyclerViewHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
            holder.text1.setText(position + "");
        }

        @Override
        public int getItemCount() {
            return Integer.MAX_VALUE;
        }
    }

    private class RecyclerViewHolder extends RecyclerView.ViewHolder {
        public TextView text1;

        public RecyclerViewHolder(View itemView) {
            super(itemView);
            text1 = itemView.findViewById(android.R.id.text1);
        }
    }

    private class RVItemDecoration extends RecyclerView.ItemDecoration {
        private Drawable mDrawable;

        /**
         * 单位pix。默认是0pix。
         */
        private int mDividerHeight = 0;

        //分割线四周的margin。这四个值不是用来设置RecyclerView的每一个item的margin值。
        private int marginLeft = 0, marginTop = 0, marginRight = 0, marginBottom = 0;

        public RVItemDecoration(Context context) {
            mDrawable = ContextCompat.getDrawable(context, R.drawable.yellow);
        }

        public void setDividerHeight(int height) {
            this.mDividerHeight = height;
        }

        public void setDividerMargin(int left, int top, int right, int bottom) {
            this.marginLeft = left;
            this.marginTop = top;
            this.marginRight = right;
            this.marginBottom = bottom;
        }

        @Override
        public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
            canvas.save();

            int left = 0;
            int right = parent.getWidth();

            int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                View child = parent.getChildAt(i);

                mDrawable.setBounds(left + marginLeft, child.getBottom() + marginTop, right - marginRight, child.getBottom() + mDividerHeight - marginBottom);

                mDrawable.draw(canvas);
            }

            canvas.restore();
        }

        /**
         * outRect.set()函数相当于给RecyclerView的每一个item的View四周设置margin值。
         * 此处的margin值不同于onDraw里面的margin,onDraw里面给mDrawable设置的margin,仅仅是针对分割条而言。
         *
         * @param outRect
         * @param view
         * @param parent
         * @param state
         */
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            outRect.set(0, 0, 0, mDividerHeight);

            //测试。给RecyclerView的每一个item设置一个浅灰色背景。
            view.setBackgroundColor(Color.LTGRAY);
        }
    }
}

r/drawable/yellow.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="50px" />

    <gradient
        android:angle="0"
        android:endColor="#FFDC9E "
        android:startColor="#D9983B"
        android:type="linear" />
</shape>

so:

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/85054065
今日推荐