RecyclerView设置height为"wrap_content"不生效

今天发现给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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值