RecyclerView自适应高度的LinearLayoutManager
2015-12-23 16:10
369 查看
/**
* Created by LeoCheung on 2015/12/23.
*/
public class MyLinearLayout extends LinearLayoutManager{
private static final int CHILD_WIDTH = 0;
private static final int CHILD_HEIGHT = 1;
private static final int DEFAULT_CHILD_SIZE = 100;
private final int[] childDimensions = new int[2];
private int childSize = DEFAULT_CHILD_SIZE;
private boolean hasChildSize;
@SuppressWarnings("UnusedDeclaration")
public MyLinearLayout(Context context) {
super(context);
}
@SuppressWarnings("UnusedDeclaration")
public MyLinearLayout(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);
int width = 0;
int height = 0;
Logger.d("state:" + state.toString());
for (int i = 0; i < getItemCount(); i++) {
try {
measureScrapChild(recycler, i,
widthSpec,
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
if (getOrientation() == HORIZONTAL) {
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
height = height + mMeasuredDimension[1];
if (i == 0) {
width = mMeasuredDimension[0];
}
}
}
Logger.d("ll width:"+width+";widthSize:"+widthSize+";widthSpec:"+widthSpec);
Logger.d("ll height:"+width+";heightSize:"+heightSize+";heightSpec:"+heightSpec);
Logger.d("ll widthMode:"+widthMode+";heightMode:"+heightMode);
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:
}
setMeasuredDimension(widthSpec, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) {
View view = recycler.getViewForPosition(position);
// For adding Item Decor Insets to view
// super.measureChildWithMargins(view, 0, 0);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(widthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
// Logger.e("SyLinearLayoutManager state:" + state.toString());
super.onLayoutChildren(recycler, state);
}
}
* Created by LeoCheung on 2015/12/23.
*/
public class MyLinearLayout extends LinearLayoutManager{
private static final int CHILD_WIDTH = 0;
private static final int CHILD_HEIGHT = 1;
private static final int DEFAULT_CHILD_SIZE = 100;
private final int[] childDimensions = new int[2];
private int childSize = DEFAULT_CHILD_SIZE;
private boolean hasChildSize;
@SuppressWarnings("UnusedDeclaration")
public MyLinearLayout(Context context) {
super(context);
}
@SuppressWarnings("UnusedDeclaration")
public MyLinearLayout(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);
int width = 0;
int height = 0;
Logger.d("state:" + state.toString());
for (int i = 0; i < getItemCount(); i++) {
try {
measureScrapChild(recycler, i,
widthSpec,
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
if (getOrientation() == HORIZONTAL) {
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
height = height + mMeasuredDimension[1];
if (i == 0) {
width = mMeasuredDimension[0];
}
}
}
Logger.d("ll width:"+width+";widthSize:"+widthSize+";widthSpec:"+widthSpec);
Logger.d("ll height:"+width+";heightSize:"+heightSize+";heightSpec:"+heightSpec);
Logger.d("ll widthMode:"+widthMode+";heightMode:"+heightMode);
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:
}
setMeasuredDimension(widthSpec, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) {
View view = recycler.getViewForPosition(position);
// For adding Item Decor Insets to view
// super.measureChildWithMargins(view, 0, 0);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(widthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
// Logger.e("SyLinearLayoutManager state:" + state.toString());
super.onLayoutChildren(recycler, state);
}
}
相关文章推荐
- 整理的学习swift的网站和资源
- Android环境下使用cordova从事手写签名代码
- iOS-横竖屏管理,支持所有方向旋转时用代码控制允许旋转&不允许旋转
- sql server 重复记录
- log4j 配置信息解释
- js判断日期是不是周末
- 图片上下左右居中等比缩放
- IOS中 Block简介与用法(一)
- PHP总结
- windows下linux内核源代码阅读 Source Insight3.5工具
- 电机的S型曲线加速
- ORA-19809: 超出了恢复文件数的限制故障处理实例
- 如何使用strace+pstack利器分析程序性能
- 本人git上的一些demo
- hdu oj 2044 小蜜蜂之解题报告
- Net--必须知道Class和struct的关系[转]
- C++11 不抛异常的new operator
- Android 之 去除 Jar 包中 META-INF/DEPENDENCIES.txt
- 史上最详细的Android Studio系列教程四--Gradle基础
- 中文分词项目(开源/API接口)总结