使用场景是直接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了。
网友评论