最近项目中遇到的头疼问题之一,加载两个布局之后不能自动轮播。
项目首页需要轮播展示两个项目,需要的是一种淡入淡出的动画效果,后来我就想到是用BGABanner来实现。项目轮播也是由它实现的,大概实现下面效果
如何实现
- 项目目录下,bulid.gradle中导入BGABanner
implementation 'cn.bingoogolapple:bga-banner:2.2.5@aar'
- 布局文件中,有几点要说明一下,因为不需要轮播的圆点,所以我这里都设置了点和背景都为透明色,淡入淡出动画效果设置为app:banner_transitionEffect=“fade”
<cn.bingoogolapple.bgabanner.BGABanner
android:id="@+id/banner_recommond"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:banner_pageChangeDuration="2000"
app:banner_pointAutoPlayAble="true"
app:banner_pointAutoPlayInterval="7000"
app:banner_pointContainerBackground="@android:color/transparent"
app:banner_pointDrawable="@drawable/selector_banner_point"
app:banner_transitionEffect="fade"/>
- 获取服务器数据后,得到list3,for循环生成的布局都可以添加到banner中
List<View> viewPagerContentList = new ArrayList<View>();
private BGABanner bannerRecommond;
public void addVpView() {
bannerRecommond = findViewById(R.id.banner_recommond);
View vpView;
viewPagerContentList.clear();
for (int i = 0; i < list3.size(); i++) {
vpView = View.inflate(getActivity(), R.layout.view_pager_recom_item, null);
ImageView iv = vpView.findViewById(R.id.iv_recom);
String recommondUrl = Constants.BASE_URL + "Upload/" + list3.get(i).getImg_url().replaceAll("\\\\", "");
Glide.with(getActivity())
.load(recommondUrl)
.asBitmap()
.placeholder(R.mipmap.tu)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(new BitmapImageViewTarget(iv){
@Override
protected void setResource(Bitmap resource) {
super.setResource(resource);
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(getActivity().getResources(), resource);
circularBitmapDrawable.setCornerRadius(12);
iv.setImageDrawable(circularBitmapDrawable);
}
});
TextView tvrata = vpView.findViewById(R.id.benjinNunber);
TextView zz = vpView.findViewById(R.id.lilvNumber);
TextView qx = vpView.findViewById(R.id.tv_fwzq);
TextView content = vpView.findViewById(R.id.xinZuYiCi);
tvrata.setText(list3.get(i).getRate() + "+");
zz.setText(list3.get(i).getExpect_rate() + "%");
qx.setText("服务租期: " + list3.get(i).getMonth() + "个月");
content.setText(list3.get(i).getName());
viewPagerContentList.add(vpView);
}
initViewpager();
}
private void initViewpager() {
bannerRecommond.setDelegate(new BGABanner.Delegate<LinearLayout, String>() {
@Override
public void onBannerItemClick(BGABanner banner, LinearLayout layout, String model, int position) {
if (TextUtils.isEmpty(SharedPrefUtil.getString(getActivity(), Constants.TOKEN, ""))) {
showLoginDialog();
return;
}
Intent intent = new Intent(getActivity(), TenantProductServeActivity.class);
intent.putExtra("recomdId", list3.get(position).getId());
intent.putExtra("title", list3.get(position).getName());
startActivity(intent);
}
});
bannerRecommond.setData(viewPagerContentList);
}
注:正常流程走下来确实能实现效果,但是发现不能自动轮播,这个问题处理起来就麻烦了,无论设置轮播时间还是网上查api都不能实现效果,网上也搜不到答案,后来在BGAqq群里发现有人遇到跟我一样的问题,是因为BGABanner加载布局时,viewpager数少于4个时则不能轮播
这是BGABanner的bug,原作者可能还没有将其解决掉。但是问题还是要解决的,我这里通过判断如果加载的布局数少于等于3时就把集合就再addAll()一遍原来的集合,使数量大于等于4,布局为1时则不考虑,而且也不影响轮播次序,问题解决
list3.addAll(list2);
if (list2.size() <= 3) {
list3.addAll(list2);
}
希望我的答案能帮助到你们,有不清楚的地方可以在下方评论区留言