Bander
Bander轮播图+MVP
依赖
implementation 'com.youth.banner:banner:1.4.10'//轮播图
implementation 'com.github.bumptech.glide:glide:4.9.0'//glide依赖
//RxJava依赖
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
//Retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
//Gson converter gson解析
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
//RxJava2 Adapter
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
//okhttp
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
implementation 'com.android.support:design:28.0.0'
implementation project(path: ':mvp')//导入tablayout
自动组件化包的MVP
1.model层
public interface IModel {
void destroy();
}
public class BaseModel implements IModel{
@Override
public void destroy() {
}
}
2.presenter层
public interface IPresenter {
void destroy();
}
import com.example.mvp.model.IModel;
import com.example.mvp.view.IView;
public class BasePresenter<M extends IModel,V extends IView> implements IPresenter{
protected M mModel;
protected V mView;
public BasePresenter(M mModel, V mView) {
this.mModel = mModel;
this.mView = mView;
}
@Override
public void destroy() {
}
}
3.view层
public interface IActivity {
int bindLayout();
void initView();
void initData();
}
public interface IFragment extends IActivity{
}
public interface IView {
void showToast(String s);
}
//导包
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.mvp.presenter.IPresenter;
public abstract class BaseActivity<P extends IPresenter> extends AppCompatActivity implements IActivity,IView {
protected P mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(bindLayout());
initView();
initData();
}
}
//导包
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.example.mvp.presenter.IPresenter;
public abstract class BaseFragment<P extends IPresenter> extends Fragment implements IFragment,IView {
protected P mPresenter;
protected View inflate;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
inflate = inflater.inflate(bindLayout(), null);
return inflate;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
initData();
}
}
MVP
1.contract层
//导包
import com.example.mtbander.entivi.Girl;
import com.example.mvp.model.IModel;
import com.example.mvp.view.IView;
import io.reactivex.Observer;
public interface GirlContract {
interface GirlModel extends IModel{
void getGirl(Observer<Girl> observer);
}
interface GirlView extends IView{
//轮播图不需要集合传入
void getivit(Girl girl);
}
}
2.model层
import com.example.mtbander.Api;
import com.example.mtbander.MVP.contract.GirlContract;
import com.example.mtbander.entivi.Girl;
import com.example.mvp.model.BaseModel;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class GirlModel extends BaseModel implements GirlContract.GirlModel {
@Override
public void getGirl(Observer<Girl> observer) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://gank.io/api/v2/")//网址 https://gank.io/api/v2/data/category/GanHuo/type/Android/page/1/count/10
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
//接口网址调用方法
Api api = retrofit.create(Api.class);
//调用方法
api.getobserval("Girl","Girl",1,96)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(observer);
}
}
3.presenter层
//导包
import com.example.mtbander.MVP.contract.GirlContract;
import com.example.mtbander.entivi.Girl;
import com.example.mvp.presenter.BasePresenter;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public class GirlPresenter extends BasePresenter<GirlContract.GirlModel,GirlContract.GirlView> {
public GirlPresenter(GirlContract.GirlModel mModel, GirlContract.GirlView mView) {
super(mModel, mView);
}
public void getGirl(){
mModel.getGirl(new Observer<Girl>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Girl girl) {
//传值
mView.getivit(girl);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
4.view层
//导包
import android.content.Context;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.example.mtbander.MVP.contract.GirlContract;
import com.example.mtbander.MVP.model.GirlModel;
import com.example.mtbander.MVP.presenter.GirlPresenter;
import com.example.mtbander.R;
import com.example.mtbander.entivi.Girl;
import com.example.mvp.view.BaseFragment;
import com.youth.banner.Banner;
import com.youth.banner.loader.ImageLoader;
import java.util.List;
public class BlankFragment extends BaseFragment<GirlPresenter> implements GirlContract.GirlView {
private Banner banders;
@Override
public void getivit(final Girl girl) {
//获取图片数据
List<Girl.DataBean> data = girl.getData();
//传值
banders.setImages(data);
//调用方轮播
banders.setImageLoader(new ImageLoader() {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
//强转
Girl.DataBean image = (Girl.DataBean) path;
//赋值 拿到图片
Glide.with(context).load(image.getUrl()).into(imageView);
}
});
//启动
banders.start();
}
@Override
public int bindLayout() {
return R.layout.fragment_blank;
}
@Override
public void initView() {
banders = (Banner) inflate.findViewById(R.id.banders);
}
@Override
public void initData() {
//用自己MVP自定义的参数不然出不来
mPresenter = new GirlPresenter(new GirlModel(),this);
mPresenter.getGirl();
}
@Override
public void showToast(String s) {
}
}
Fragment适配器
1.适配器
//导包
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class FragmentAdaper extends FragmentPagerAdapter {
private List<Fragment> list;
private List<String> list1;
public FragmentAdaper(FragmentManager fm, List<Fragment> list, List<String> list1) {
super(fm);
this.list = list;
this.list1 = list1;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return list1.get(position);
}
}
Girl实体类
1.实体类
import java.util.List;
public class Girl {
/**
* data : [{"_id":"5e959250808d6d2fe6b56eda","author":"鸢媛","category":"Girl","createdAt":"2020-05-25 08:00:00","desc":"与其安慰自己平凡可贵,\n不如拼尽全力活得漂亮。 \u200b \u200b\u200b\u200b\u200b","images":["http://gank.io/images/f4f6d68bf30147e1bdd4ddbc6ad7c2a2"],"likeCounts":7,"publishedAt":"2020-05-25 08:00:00","stars":1,"title":"第96期","type":"Girl","url":"http://gank.io/images/f4f6d68bf30147e1bdd4ddbc6ad7c2a2","views":13505},{"_id":"5e95923f808d6d2fe6b56ed8","author":"鸢媛","category":"Girl","createdAt":"2020-05-24 08:00:00","desc":"这世界总有人在笨拙地爱着你,想把全部的温柔都给你。 \u200b\u200b\u200b\u200b","images":["http://gank.io/images/dc75cbde1d98448183e2f9514b4d1320"],"likeCounts":4,"publishedAt":"2020-05-24 08:00:00","stars":1,"title":"第95期","type":"Girl","url":"http://gank.io/images/dc75cbde1d98448183e2f9514b4d1320","views":5787},{"_id":"5e95922e808d6d2fe6b56ed6","author":"鸢媛","category":"Girl","createdAt":"2020-05-23 08:00:00","desc":"陪伴本来就是这世界上最了不起的安慰\u200b。","images":["http://gank.io/images/6b2efa591564475fb8bc32291fb0007c"],"likeCounts":1,"publishedAt":"2020-05-23 08:00:00","stars":1,"title":"第94期","type":"Girl","url":"http://gank.io/images/6b2efa591564475fb8bc32291fb0007c","views":5114},{"_id":"5e959200ee6ba981da2af34d","author":"鸢媛","category":"Girl","createdAt":"2020-05-22 08:00:00","desc":"长不过执念,短不过善变。","images":["http://gank.io/images/d6bba8cf5b8c40f9ad229844475e9149"],"likeCounts":2,"publishedAt":"2020-05-22 08:00:00","stars":1,"title":"第93期","type":"Girl","url":"http://gank.io/images/d6bba8cf5b8c40f9ad229844475e9149","views":4073},{"_id":"5e9591dcee6ba981da2af34b","author":"鸢媛","category":"Girl","createdAt":"2020-05-21 08:00:00","desc":"无论多么艰难的现在,终会翻篇。\n朝未来大步向前吧,别丧,别止步。","images":["http://gank.io/images/9fa43020cf724c69842eec3e13f6d21c"],"likeCounts":4,"publishedAt":"2020-05-21 08:00:00","stars":1,"title":"第92期","type":"Girl","url":"http://gank.io/images/9fa43020cf724c69842eec3e13f6d21c","views":2719},{"_id":"5e9591c60bd5529b54e712af","author":"鸢媛","category":"Girl","createdAt":"2020-05-20 08:00:00","desc":"希望下一次,能喜欢上一个也喜欢自己的人 \u200b\u200b\u200b\u200b。","images":["http://gank.io/images/d237f507bf1946d2b0976e581f8aab9b"],"likeCounts":0,"publishedAt":"2020-05-20 08:00:00","stars":1,"title":"第91期","type":"Girl","url":"http://gank.io/images/d237f507bf1946d2b0976e581f8aab9b","views":2284},{"_id":"5e9591b6808d6d2fe6b56ed5","author":"鸢媛","category":"Girl","createdAt":"2020-05-19 08:00:00","desc":"这个世界上,\n有些人有多冷漠,\n有些人就有多温暖,\n希望你总会遇到那些温暖对你的人。","images":["http://gank.io/images/25d3e3db2c1248bb917c09dc4f50a46f"],"likeCounts":1,"publishedAt":"2020-05-19 08:00:00","stars":1,"title":"第90期","type":"Girl","url":"http://gank.io/images/25d3e3db2c1248bb917c09dc4f50a46f","views":3153},{"_id":"5e9591a2ee6ba981da2af34a","author":"鸢媛","category":"Girl","createdAt":"2020-05-18 08:00:00","desc":"以前对你的喜欢,\n是见你,念你,陪伴你。\n现在对你的喜欢,\n是不问,不看,不叨扰。","images":["http://gank.io/images/19c99c447e0a40a6b3ff89951957cfb1"],"likeCounts":0,"publishedAt":"2020-05-18 08:00:00","stars":1,"title":"第89期","type":"Girl","url":"http://gank.io/images/19c99c447e0a40a6b3ff89951957cfb1","views":2148},{"_id":"5e959197808d6d2fe6b56ed4","author":"鸢媛","category":"Girl","createdAt":"2020-05-17 08:00:00","desc":"只要结局是喜剧,过程你要我怎么哭都行,幸福可以来的慢一些,\n只要它是真的,如果最后能在一起,晚点我真的无所谓的。","images":["http://gank.io/images/f0c192e3e335400db8a709a07a891b2e"],"likeCounts":0,"publishedAt":"2020-05-17 08:00:00","stars":1,"title":"第88期","type":"Girl","url":"http://gank.io/images/f0c192e3e335400db8a709a07a891b2e","views":3053},{"_id":"5e95915f808d6d2fe6b56ed3","author":"鸢媛","category":"Girl","createdAt":"2020-05-16 08:00:00","desc":"若不是情深似海,思念又怎会泛滥成灾。","images":["http://gank.io/images/bdb35e4b3c0045c799cc7a494a3db3e0"],"likeCounts":3,"publishedAt":"2020-05-16 08:00:00","stars":1,"title":"第87期","type":"Girl","url":"http://gank.io/images/bdb35e4b3c0045c799cc7a494a3db3e0","views":4509}]
* page : 1
* page_count : 10
* status : 100
* total_counts : 96
*/
private int page;
private int page_count;
private int status;
private int total_counts;
private List<DataBean> data;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPage_count() {
return page_count;
}
public void setPage_count(int page_count) {
this.page_count = page_count;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getTotal_counts() {
return total_counts;
}
public void setTotal_counts(int total_counts) {
this.total_counts = total_counts;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* _id : 5e959250808d6d2fe6b56eda
* author : 鸢媛
* category : Girl
* createdAt : 2020-05-25 08:00:00
* desc : 与其安慰自己平凡可贵,
不如拼尽全力活得漂亮。
* images : ["http://gank.io/images/f4f6d68bf30147e1bdd4ddbc6ad7c2a2"]
* likeCounts : 7
* publishedAt : 2020-05-25 08:00:00
* stars : 1
* title : 第96期
* type : Girl
* url : http://gank.io/images/f4f6d68bf30147e1bdd4ddbc6ad7c2a2
* views : 13505
*/
private String _id;
private String author;
private String category;
private String createdAt;
private String desc;
private int likeCounts;
private String publishedAt;
private int stars;
private String title;
private String type;
private String url;
private int views;
private List<String> images;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getLikeCounts() {
return likeCounts;
}
public void setLikeCounts(int likeCounts) {
this.likeCounts = likeCounts;
}
public String getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(String publishedAt) {
this.publishedAt = publishedAt;
}
public int getStars() {
return stars;
}
public void setStars(int stars) {
this.stars = stars;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getViews() {
return views;
}
public void setViews(int views) {
this.views = views;
}
public List<String> getImages() {
return images;
}
public void setImages(List<String> images) {
this.images = images;
}
}
}
API
1.API
//导包
import com.example.mtbander.entivi.Girl;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Path;
public interface Api {
//拼接字符串
@GET("data/category/{category}/type/{type}/page/{page}/count/{count}")
Observable<Girl> getobserval(@Path("category")String category,@Path("type")String type,@Path("page")int page,@Path("count")int count);
}
Activity代码
//导包
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import com.example.mtbander.MVP.view.BlankFragment;
import com.example.mtbander.adaper.FragmentAdaper;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager vip;
private TabLayout tab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
List<Fragment> list = new ArrayList<>();
list.add(new BlankFragment());
List<String> list1 = new ArrayList<>();
list1.add("美女");
FragmentAdaper fragmentAdaper = new FragmentAdaper(getSupportFragmentManager(), list, list1);
//适配器赋值
vip.setAdapter(fragmentAdaper);
//绑定
tab.setupWithViewPager(vip);
}
private void initView() {
vip = (ViewPager) findViewById(R.id.vip);
tab = (TabLayout) findViewById(R.id.tab);
}
}
布局
1.Activity布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/vip"
android:layout_width="match_parent"
android:layout_height="660dp"
tools:ignore="MissingConstraints">
</androidx.viewpager.widget.ViewPager>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
</com.google.android.material.tabs.TabLayout>
</LinearLayout>
2.Fragment布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MVP.view.BlankFragment">
<com.youth.banner.Banner
android:id="@+id/banders"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.youth.banner.Banner>
</LinearLayout>
效果
1.图片