Android RecyclerView新增分割線
阿新 • • 發佈:2019-01-26
不知道那些工作了好久的大神是怎樣堅持寫部落格的,我發現我完全沒時間寫啊!就算有時間寫,在路上想好要學些什麼結果一回到租房,直接就往床上躺了。今天在外面跑步發現年初立下要好好學習,抽時間出來寫部落格記錄下自己的學習,結果發現部落格上P都沒有,於是跑完步回來立馬擼了個demo。湊個數,不知道自己到底能否堅持下去,這年頭在創業公司呆也不是走也不是,哎!
直接上程式碼吧!
DividerItemDecoration 分割線核心類
package com.example.richard.myapplication;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by richard on 2016/6/19.
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private int orientation = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int[] attrs = new int[]{android.R.attr.listDivider};
public DividerItemDecoration(Context context, int orientation) {
TypedArray typedArray = context.obtainStyledAttributes(attrs);
mDivider = typedArray.getDrawable(0 );
typedArray.recycle();
setOrientation(orientation);
}
public DividerItemDecoration(Context context, int orientation, int resId){
mDivider = context.getResources().getDrawable(resId);
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {
throw new IllegalArgumentException("this orientation is error!");
}
this.orientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (orientation == LinearLayoutManager.VERTICAL) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//先呼叫getItemOffsets獲取條目之間的間隙
//獲得條目的偏移量(所有的條目都回呼叫一次該方法)
if (orientation == LinearLayoutManager.VERTICAL) {//垂直的畫水平線
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
//水平的畫垂直線
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
/**
* 垂直方向 畫水平線
*
* @param c
* @param parent
*/
private void drawVertical(Canvas c, RecyclerView parent) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight(); //減去內邊距
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin + (int) ViewCompat.getTranslationY(child);//可能有外邊距 或 者有偏移的動畫
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
/**
* 水平方向 畫垂直線
*
* @param c
* @param parent
*/
private void drawHorizontal(Canvas c, RecyclerView parent) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom(); //減去內邊距
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) ViewCompat.getTranslationX(child);//可能有外邊距 或 者有偏移的動畫
int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
adapter
package com.example.richard.myapplication;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyViewHolder> {
private List<String> dataList;
public TestAdapter(List<String> list) {
this.dataList = list;
}
@Override
public int getItemCount() {
return dataList.size();
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(dataList.get(position));
holder.tv.setBackgroundColor(Color.rgb((int)(Math.random() * 255),(int)(Math.random() * 255),(int)(Math.random() * 255)));
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
}
MainActivity:
package com.example.richard.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Button btn;
private boolean isVertichal = true;
private DividerItemDecoration itemDecoration;
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
recyclerView = (RecyclerView) findViewById(R.id.recylerview);
List<String> dataList = new ArrayList<>();
for (int i = 0; i < 100; i++){
dataList.add("編號: " + i);
}
TestAdapter adapter = new TestAdapter(dataList);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
itemDecoration = new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
recyclerView.addItemDecoration(itemDecoration);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recyclerView.removeItemDecoration(itemDecoration);
if (isVertichal){
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false));
itemDecoration = new DividerItemDecoration(MainActivity.this, LinearLayoutManager.HORIZONTAL, R.drawable.divider_item);
recyclerView.addItemDecoration(itemDecoration);
}else{
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
itemDecoration = new DividerItemDecoration(MainActivity.this, LinearLayoutManager.VERTICAL, R.drawable.divider_item);
recyclerView.addItemDecoration(itemDecoration);
}
isVertichal = !isVertichal;
}
});
}
}
divider_item:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:width="2dp"
android:height="2dp"/>
<solid
android:color="#ff0000"/>
</shape>
效果如下:
水平豎直的分割線就沒截圖了。PS:這年頭理想值錢?讓我很惆悵啊!感覺什麼都是假的,唯有自己身體好才是真的。