之前做商城类App
的时候,会遇到多个Banner
需求,那么我们有没有办法快速实现Banner
呢?答案是有的,具体怎么做请看我下面的分享。
Banner引入
implementation('io.github.youth5201314:banner:2.2.2')
截止写博客的时间,最新的版本是2.2.2
。需要注意的是2.1.0
版本之后,仓库地址变成:
repositories {
maven { url "https://s01.oss.sonatype.org/content/groups/public" }
}
必须添加这个仓库地址,否则编译器会报错的。Banner仓库的地址,最新版本可以这里查看
Banner使用范例
1.XML显示Banner控件
<com.youth.banner.Banner
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="200dp" />
我在开发的项目当中的,高度是200dp
。看文章的小伙伴可以根据自己的需要来自定义哈。
2.创建Banner适配器
/**
* 自定义布局,下面是常见的图片样式,更多实现可以看demo,可以自己随意发挥
*/
public class ImageAdapter extends BannerAdapter<DataBean, ImageAdapter.BannerViewHolder> {
public ImageAdapter(List<DataBean> mDatas) {
//设置数据,也可以调用banner提供的方法,或者自己在adapter中实现
super(mDatas);
}
//创建ViewHolder,可以用viewType这个字段来区分不同的ViewHolder
@Override
public BannerViewHolder onCreateHolder(ViewGroup parent, int viewType) {
ImageView imageView = new ImageView(parent.getContext());
//注意,必须设置为match_parent,这个是viewpager2强制要求的
imageView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
return new BannerViewHolder(imageView);
}
@Override
public void onBindView(BannerViewHolder holder, DataBean data, int position, int size) {
holder.imageView.setImageResource(data.imageRes);
}
class BannerViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
public BannerViewHolder(@NonNull ImageView view) {
super(view);
this.imageView = view;
}
}
}
仓库的作者有提示到:这一步其实可以省略,因为有提供默认的适配器
,特殊业务处理就需要自己去处理自定义一下。
3.Banner的调用代码
public class BannerActivity extends AppCompatActivity {
public void useBanner() {
//--------------------------简单使用-------------------------------
banner.addBannerLifecycleObserver(this)//添加生命周期观察者
.setAdapter(new BannerExampleAdapter(DataBean.getTestData()))
.setIndicator(new CircleIndicator(this));
//—————————————————————————如果你想偷懒,而又只是图片轮播————————————————————————
banner.setAdapter(new BannerImageAdapter<DataBean>(DataBean.getTestData3()) {
@Override
public void onBindView(BannerImageHolder holder, DataBean data, int position, int size) {
//图片加载自己实现
Glide.with(holder.itemView)
.load(data.imageUrl)
.apply(RequestOptions.bitmapTransform(new RoundedCorners(30)))
.into(holder.imageView);
}
})
.addBannerLifecycleObserver(this)//添加生命周期观察者
.setIndicator(new CircleIndicator(this));
//更多使用方法仔细阅读文档,或者查看demo
}
}
关于Banner的使用优化
方法一:自己控制banner的生命周期
public class BannerActivity extends BaseActivity{
@Override
protected void onStart() {
super.onStart();
//开始轮播
banner.start();
}
@Override
protected void onStop() {
super.onStop();
//停止轮播
banner.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁
banner.destroy();
}
}
方法二:调用banner的addBannerLifecycleObserver()方法,让banner自己控制
public class BannerActivity extends BaseActivity{
protected void onCreate(Bundle savedInstanceState) {
//添加生命周期观察者
banner.addBannerLifecycleObserver(this);
}
}