版权声明:本文为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: