Android RecyclerView ItemDecoration divider line with drawable
阿新 • • 發佈:2018-12-21
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: