package com.weikou.beibeivideo.widget;
|
|
import android.content.Context;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.RecyclerView;
|
import android.util.Log;
|
import android.view.View;
|
import android.view.ViewGroup;
|
|
public class FullyLinearLayoutManager extends LinearLayoutManager {
|
|
|
private static final String TAG = FullyLinearLayoutManager.class.getSimpleName();
|
|
public FullyLinearLayoutManager(Context context) {
|
super(context);
|
}
|
|
public FullyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
|
super(context, orientation, reverseLayout);
|
}
|
|
private int[] mMeasuredDimension = new int[2];
|
|
@Override
|
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
|
int widthSpec, int heightSpec) {
|
|
final int widthMode = View.MeasureSpec.getMode(widthSpec);
|
final int heightMode = View.MeasureSpec.getMode(heightSpec);
|
final int widthSize = View.MeasureSpec.getSize(widthSpec);
|
final int heightSize = View.MeasureSpec.getSize(heightSpec);
|
|
Log.i(TAG, "onMeasure called. \nwidthMode " + widthMode
|
+ " \nheightMode " + heightSpec
|
+ " \nwidthSize " + widthSize
|
+ " \nheightSize " + heightSize
|
+ " \ngetItemCount() " + getItemCount());
|
|
int width = 0;
|
int height = 0;
|
for (int i = 0; i < getItemCount(); i++) {
|
measureScrapChild(recycler, i,
|
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
mMeasuredDimension);
|
|
if (getOrientation() == HORIZONTAL) {
|
width = width + mMeasuredDimension[0];
|
if (i == 0) {
|
height = mMeasuredDimension[1];
|
}
|
} else {
|
height = height + mMeasuredDimension[1];
|
if (i == 0) {
|
width = mMeasuredDimension[0];
|
}
|
}
|
}
|
switch (widthMode) {
|
case View.MeasureSpec.EXACTLY:
|
width = widthSize;
|
case View.MeasureSpec.AT_MOST:
|
case View.MeasureSpec.UNSPECIFIED:
|
}
|
|
switch (heightMode) {
|
case View.MeasureSpec.EXACTLY:
|
height = heightSize;
|
case View.MeasureSpec.AT_MOST:
|
case View.MeasureSpec.UNSPECIFIED:
|
}
|
if (height > 0)
|
setMeasuredDimension(width, height);
|
}
|
|
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
|
int heightSpec, int[] measuredDimension) {
|
try {
|
View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException
|
|
if (view != null) {
|
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
|
|
int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
|
getPaddingLeft() + getPaddingRight(), p.width);
|
|
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
|
getPaddingTop() + getPaddingBottom(), p.height);
|
|
view.measure(childWidthSpec, childHeightSpec);
|
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
|
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
|
recycler.recycleView(view);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
}
|
}
|
}
|