Android之Banner轮播图
1.添加网络权限和导入相关的依赖1).网络权限<uses-permission android:name="android.permission.INTERNET"/>2).依赖//banner依赖implementation 'com.youth.banner:banner:1.4.10'// 最新版本implementation 'com.github.bumptech.glide
·
1.添加网络权限和导入相关的依赖
1).网络权限
<uses-permission android:name="android.permission.INTERNET"/>
2).依赖
//banner依赖
implementation 'com.youth.banner:banner:1.4.10'
// 最新版本
implementation 'com.github.bumptech.glide:glide:4.8.0'//glide图片加载框架
2.创建封装类(比较简单,这里就不贴代码了)
3.创建一个接口(ApiService)(网络请求我使用的是RxJava+Retrofit,所以我这里讲的方法是RxJava+Retrofit的,当然网络请求你们也可以用其他的,我在这里只讲这一种方法)
String path = "https://www.wanandroid.com/";
@GET("banner/json")
Observable<BannerBean> getBanner();
RxJava+Retrofit依赖:
//RxJava和Retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0' // 必要依赖,解析json字符所用
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' // 必要依赖,和Rxjava结合必须用到,下面会提到
implementation "io.reactivex.rxjava2:rxjava:2.1.3" // 必要rxjava2依赖
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
4.适配器(我弄的多布局样式的适配器,但适配器目前只写了banner)
private Context context;
private List<BannerBean.DataBean> data = new ArrayList<>();
public static final int BANNER_TYPE = 0;
public BannerAdapter(Context context) {
this.context = context;
}
public void setData(List<BannerBean.DataBean> data) {
this.data.addAll(data);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if(position==0){
return BANNER_TYPE;
}
return 0;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if(viewType==BANNER_TYPE){
View inflate = LayoutInflater.from(context).inflate(R.layout.banner_item, parent, false);
return new BannerViewHolder(inflate);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
int itemViewType = getItemViewType(position);
if(itemViewType==0){
BannerViewHolder bannerViewHolder = (BannerViewHolder) holder;
bannerViewHolder.banner.setImages(data).setImageLoader(new ImageLoader() {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
BannerBean.DataBean bean = (BannerBean.DataBean) path;
Glide.with(context).load(bean.getImagePath()).into(imageView);
}
}).start();
}
}
@Override
public int getItemCount() {
return data !=null ? 1:0;
}
private class BannerViewHolder extends RecyclerView.ViewHolder {
Banner banner;
public BannerViewHolder(View inflate) {
super(inflate);
banner = inflate.findViewById(R.id.banner);
}
}
5.banner_item的布局:
<com.youth.banner.Banner
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/banner"
/>
6.activity:布局是RecyclerView,这里就不贴代码了
private RecyclerView recycler;
private BannerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
Retrofit build = new Retrofit.Builder()
.baseUrl(ApiService.path)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
final ApiService apiService = build.create(ApiService.class);
apiService.getBanner().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BannerBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BannerBean bannerBean) {
List<BannerBean.DataBean> data = bannerBean.getData();
adapter.setData(data);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
private void initView() {
recycler = findViewById(R.id.recycler);
recycler.setLayoutManager(new LinearLayoutManager(this));
adapter = new BannerAdapter(this);
recycler.setAdapter(adapter);
}
好了,到这里就大功告成了,欢迎大家提出意见!
下面给大家找了一些banner的其他属性,具体其他的如果下面没有,那就自行百度吧!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)