1.添加依赖 api 'com.android.support:recyclerview-v7:27.1.1'
2.构建适配器(适配器getItemCount的数量一定要大于0)
public class BeautyAdapter extends RecyclerView.Adapter<BeautyAdapter.BeautyViewHolder> { private List<BeautyRes.ResultsBean> mDatas; private Context mContext; private int layout; public BeautyAdapter(List<BeautyRes.ResultsBean> mDatas, Context mContext, int layout) { this.mDatas = mDatas; this.mContext = mContext; this.layout=layout; } @NonNull @Override public BeautyAdapter.BeautyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflateView = LayoutInflater.from(mContext).inflate(layout, parent, false); BeautyAdapter.BeautyViewHolder beautyViewHolder=new BeautyAdapter.BeautyViewHolder(inflateView); return beautyViewHolder; } @Override public void onBindViewHolder(@NonNull BeautyAdapter.BeautyViewHolder holder, int position) { String url = mDatas.get(position).getUrl(); Glide.with(mContext).load(url).into(holder.imageView); } @Override public int getItemCount() { return mDatas.size(); } public static class BeautyViewHolder extends RecyclerView.ViewHolder{ private ImageView imageView; public BeautyViewHolder(View itemView) { super(itemView); imageView=itemView.findViewById(R.id.social_chat_bg_iv); } } } 2.自定义分割线 第一步: 因为是瀑布流所以先画一个横竖的正方形 <?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" /> </shape> 第二步: 在系统的recyclerView属性中添加style
<item name="android:listDivider">@drawable/divider_shape</item>第三步: 因为RecyclerView不想ListView一样所以需要自己编写分割线
package com.dejun.commonsdk.wight;
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.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
/**
* Author:DoctorWei
* Time:2018/12/8 18:22
* Description:
* email:[email protected]
*/
public class StaggeredDividerItemDecoration extends RecyclerView.ItemDecoration {
private int[] attrs = new int[]{
android.R.attr.listDivider
};
public static final int DIRECTION_VERTICAL = 0;
public static final int DIRECTION_HORIZONTAL = 1;
private Drawable divider;
private int direction;
private final int column;
public StaggeredDividerItemDecoration(Context context, int direction, int column) {
super();
TypedArray typedArray = context.obtainStyledAttributes(attrs);
divider = typedArray.getDrawable(0);
this.direction = direction;
this.column = column;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
System.out.println("onDraw" + state.toString());
super.onDraw(c, parent, state);
if (divider == null)
return;
if (direction == DIRECTION_VERTICAL) {
drawVerticalDivider(c, parent);
} else {
drawHoriziontalDivider(c, parent);
}
}
private void drawHoriziontalDivider(Canvas c, RecyclerView parent) {
int left = 0;
int top = 0;
int right = 0;
int bottom = 0;
for (int i = 0; i < parent.getChildCount(); i++) {
View child = parent.getChildAt(i);
int position = ((StaggeredGridLayoutManager.LayoutParams) child.getLayoutParams()).getSpanIndex();
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
//头部第一条线
if (position == 0) {
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = top + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin;
right = child.getRight() + layoutParams.rightMargin;
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
//最右边的线
if (i >= parent.getChildCount() - column) {
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();
left = child.getRight() + layoutParams.rightMargin;
right = left + divider.getIntrinsicWidth();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
//最后一个补线
if(i>=parent.getChildCount()-column&&position!=0){
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = top + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin;
right = child.getRight() + layoutParams.rightMargin;
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
//左边的线
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth();
right = left + divider.getIntrinsicWidth();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
//下面的线
top = child.getBottom() + layoutParams.bottomMargin;
bottom = top + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin;
right = child.getRight() + layoutParams.rightMargin;
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
private void drawVerticalDivider(Canvas c, RecyclerView parent) {
int left = 0;
int top = 0;
int right = 0;
int bottom = 0;
for (int i = 0; i < parent.getChildCount(); i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
int position = ((StaggeredGridLayoutManager.LayoutParams) child.getLayoutParams()).getSpanIndex();
//头部第一条线
if (i / column == 0) {
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = top + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin;
right = child.getRight() + layoutParams.rightMargin;
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
//最右边的线
if (position == column - 1) {
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();
left = child.getRight() + layoutParams.rightMargin;
right = left + divider.getIntrinsicWidth();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
//最后一个补线
if (i>=parent.getChildCount()-column&&position!=2) {
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();
left = child.getRight() + layoutParams.rightMargin;
right = left + divider.getIntrinsicWidth();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
//左边的线
top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();
bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth();
right = left + divider.getIntrinsicWidth();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
//下面的线
top = child.getBottom() + layoutParams.bottomMargin;
bottom = top + divider.getIntrinsicHeight();
left = child.getLeft() - layoutParams.leftMargin;
right = child.getRight() + layoutParams.rightMargin;
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
final StaggeredGridLayoutManager.LayoutParams slp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
int p2 = slp.getSpanIndex();
System.out.println("p2:" + p2);
System.out.println("divider:" + divider.getIntrinsicHeight() + " " + divider.getIntrinsicWidth());
int p = parent.getChildAdapterPosition(view);
int p1 = parent.getChildLayoutPosition(view);
int left = 0;
int top = 0;
int right = 0;
int bottom = 0;
System.out.println("p:" + p + " p1:" + p1 + state.toString());
if (direction == DIRECTION_VERTICAL) {
int position = parent.getChildLayoutPosition(view);
if (position / column == 0)
top = divider.getIntrinsicHeight();
if (p2 == column - 1) {
right = divider.getIntrinsicWidth();
System.out.println("p:p:p" + p);
}
left = divider.getIntrinsicWidth();
bottom = divider.getIntrinsicHeight();
outRect.set(left, top, right, bottom);
} else {
int position = parent.getChildLayoutPosition(view);
if (position / column == 0)
left = divider.getIntrinsicWidth();
if (p2 == 0)
top = divider.getIntrinsicHeight();
right = divider.getIntrinsicWidth();
bottom = divider.getIntrinsicHeight();
outRect.set(left, top, right, bottom);
}
}
}3.创建布局管理器并设置适配器(一定要设置LayoutManager)
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
staggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);//优化图片闪烁和错位mBeautyRv.setLayoutManager(staggeredGridLayoutManager);
mBeautyRv.addItemDecoration(new StaggeredDividerItemDecoration(_mActivity,StaggeredDividerItemDecoration.DIRECTION_VERTICAL,2));
mBeautyRv.setAdapter(new BeautyAdapter(beautyRes.getResults(), _mActivity, R.layout.beauty_item_layout));