项目介绍
项目中需要实现轮播图的功能,默认图片无点击效果,线上拿到的轮播图点击不同图片会跳转到不同的url页面,选择使用com.youth.banner.Banner
进行实现。
实现流程
进入页面,先往List<Bitmap> banners
里面添加默认轮播的图片,然后去进行轮播;
接着在一个新线程里面执行获取网页上或数据库中的轮播图信息,并且将图片以BitMap
的格式添加进banners
里面,将图片要跳转的url路径也存到对应的list
中,然后调用handler
发送消息,告诉主线程调用轮播图适配器的方法notifyDataSetChanged()
出现问题
重新打开app时,轮播图都是从最后一张开始播放。
解决办法
线程中获取到图片和信息后,通过handler
发送消息去直接调用对应的方法再走一遍Banner
的相关适配器设置以及其他的设置。
代码
BannerImageAdapter<Bitmap> bannerImageAdapter;
List<Bitmap> banners = new ArrayList<>();
List<String> bannerstz = new ArrayList<>();
Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
if (message.what == UPDATE_BANNER) {
initBanner();
}
return true;
}
});
banner = view.findViewById(R.id.banner);
banners.clear();
bannerstz.clear();
banners.add(BitmapFactory.decodeResource(getResources(), R.drawable.banner01));
initBanner();
new Thread(new Runnable() {
@Override
public void run() {
String bannerhttp = activity.getSJZDValue("itsys.mobportal.index_carousel_android");
if (bannerhttp != null) {
String[] bhlist = bannerhttp.split(",");
banners.clear();
for (String bm : Arrays.asList(bhlist)) {
String[] bms = bm.split("\\|");
String bmhttp = bms[0];
String bmtz = (bms.length > 1 ? bms[1] : "a");
if (bmhttp != null && !"".equals(bmhttp)) {
Bitmap bitmap = getBitmap(bmhttp);
if (bitmap != null && !"".equals(bitmap)) {
banners.add(bitmap);
bannerstz.add(bmtz);
}
}
}
// 一定要用handler发送消息更新轮播图,不然会出现闪退.
// Android Studio直接安装app不报错,但是打成apk包手动安装就会闪退报错。
mHandler.sendEmptyMessage(0);
}
}
}).start();
private void initBanner() {
bannerImageAdapter = new BannerImageAdapter<Bitmap>(banners) {
@Override
public void onBindView(BannerImageHolder holder, Bitmap data, int position, int size) {
holder.imageView.setImageBitmap(data);
holder.imageView.setScaleType(ImageView.ScaleType.FIT_XY);
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (bannerstz.size() == 0
|| bannerstz.get(position) == null
|| "a".equals(bannerstz.get(position))
|| "".equals(bannerstz.get(position))) {
return;
}
String[] strarray = bannerstz.get(position).split(":");
if (strarray.length < 2) return;
if (strarray[1].startsWith("//")) {
WebActivity.start(activity, bannerstz.get(position), null);
} else {
String url = BaseActivity.getUrl(activity).replace("/server", strarray[1]);
WebActivity.start(activity, url, null);
}
}
});
}
};
banner.setAdapter(bannerImageAdapter)
.setPageTransformer(new ZoomOutPageTransformer())
.addBannerLifecycleObserver(this)
.setIndicator(new CircleIndicator(activity));
}
问题圆满解决,至于代码中的命名问题,大家请不要在意0_0,另外如果有其他好的思路,欢迎大家指点,如果有不对的地方,也欢迎大家指正,共同进步!!!