美文网首页
ConvenientBanner的item宽度为0的问题

ConvenientBanner的item宽度为0的问题

作者: 碧桃鹦鹉 | 来源:发表于2020-09-24 18:21 被阅读0次

    使用场景是直接new一个ConvenientBanner,通过BaseQuickAdapter添加到RecyclerView中为HeaderView,

    convenientBanner = new ConvenientBanner<>(getContext());
    adapter.addHeaderView(convenientBanner);
    
    cbViewHolderCreator = new CBViewHolderCreator()
            {
                @Override
                public ImageHolderView createHolder(View itemView)
                {
                    return new ImageHolderView(itemView);
                }
    
                @Override
                public int getLayoutId()
                {
                    return R.layout.item_banner;
                }
            };
     convenientBanner.setPages(cbViewHolderCreator, bannerData);
    

    ImageHolderView中就是个简单ImageVIew

     public static class ImageHolderView extends Holder<String>
        {
            public ImageHolderView(View itemView)
            {
                super(itemView);
            }
    
            @Override
            protected void initView(View itemView)
            {
            }
    
            @Override
            public void updateUI(String data)
            {
                Glide.with(itemView)
                     .load(data)
                     .into((ImageView) itemView);
            }
        }
    
    <?xml version="1.0" encoding="utf-8"?>
    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="250dp" />
    

    这时查看布局边界的话banner的高度会有值,也就是ImageView设置的250dp高度,但是看不到图片内容。如果不这样通过addView把banner控件add进去,改为xml里面写的话就是正常的。经过debug调试发现,这种情况下ImageView是存在的,只是宽度为0而已。去ConvenientBanner的github查issue,有一个人提到了同样的问题,他指出了问题出在CBPageAdapterHelper类里的一个方法

    public void onCreateViewHolder(ViewGroup parent, View itemView) {
            RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) itemView.getLayoutParams();
            lp.width = parent.getWidth() - ScreenUtil.dip2px(itemView.getContext(), 2 * (sPagePadding + sShowLeftCardWidth));
            itemView.setLayoutParams(lp);
    }
    

    由于此时parent还未绘制完成,所以getwidth是0,所以lp的width也设置成了经过计算后的负值,所以就会是0。
    所以按着这样的思路,需要在CBPageAdapterHelper执行onCreateViewHolder后重新设置LayoutParams的width。
    所以前面的cbViewHolderCreator改为

    cbViewHolderCreator = new CBViewHolderCreator()
            {
                @Override
                public ImageHolderView createHolder(View itemView)
                {
                    ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
                    layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
                    return new ImageHolderView(itemView);
                }
    
                @Override
                public int getLayoutId()
                {
                    return R.layout.item_banner;
                }
            };
    

    这样就可以在addView的情况下正常使用ConvenientBanner了。

    相关文章

      网友评论

          本文标题:ConvenientBanner的item宽度为0的问题

          本文链接:https://www.haomeiwen.com/subject/xoltuktx.html