今天发现给RecyclerView设置height为"wrap_content"并没有生效,发现是官方的bug。
虽然在23的包上进行了修复。但在之前的版本都有这个问题。网上的方法一是在初始化时数组越界的崩溃,二是只显示第一行。
现在修改了一下,对每一行都进行测量,再把结果汇总再setMeasuredDimension。这样才能完全的显示所有行数。
public class WrapLinearLayoutManager extends LinearLayoutManager {
public WrapLinearLayoutManager(Context context) {
super(context);
}
public WrapLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
int itemCount = state.getItemCount();
if(itemCount == 0) {
super.onMeasure(recycler, state, widthSpec, heightSpec);
return ;
}
int holdMeasuredHeight = 0;
int holdMeasuredWidth = 0;
if(VERTICAL == getOrientation()){
for(int i = itemCount-1; i>=0;i--){
View view = recycler.getViewForPosition(i);
if(view != null){
measureChild(view, widthSpec, heightSpec);
holdMeasuredHeight += view.getMeasuredHeight();
}
}
holdMeasuredWidth = View.MeasureSpec.getSize(widthSpec);
}else {
int maxHeight=0;
for(int i = itemCount-1; i>=0;i--){
View view = recycler.getViewForPosition(i);
if(view != null){
measureChild(view, widthSpec, heightSpec);
holdMeasuredWidth += view.getMeasuredWidth();
if(maxHeight<view.getMeasuredHeight())maxHeight=view.getMeasuredHeight();
}
}
if(holdMeasuredWidth > View.MeasureSpec.getSize(widthSpec)){
holdMeasuredWidth = View.MeasureSpec.getSize(widthSpec);
}
holdMeasuredHeight = View.MeasureSpec.getSize(heightSpec);
if(maxHeight !=0 && maxHeight < holdMeasuredHeight){
holdMeasuredHeight = maxHeight;
}
}
setMeasuredDimension(holdMeasuredWidth, holdMeasuredHeight);
}
}