美文网首页
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