使用Rxjava和Retrofit实现Banner实现轮播图和列表数据展示

使用Rxjava和Retrofit实现Banner实现轮播图和列表数据展示

使用的权限和依赖

implementation 'com.roughike:bottom-bar:1.3.3'
implementation 'com.jcodecraeer:xrecyclerview:1.3.2'
implementation 'com.android.support:design:27.1.1'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation "io.reactivex.rxjava2:rxjava:2.1.13"//使retrofit支持Rxjava
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0' //使retrofit支持Gson解析
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'com.google.dagger:dagger:2.8'
annotationProcessor 'com.google.dagger:dagger-compiler:2.7'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.facebook.fresco:fresco:1.9.0'
implementation 'org.greenrobot:greendao:3.2.2' // add library
implementation 'com.youth.banner:banner:1.4.10'
<uses-permission android:name="android.permission.INTERNET"/>

activity_second

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
    tools:context=".SecondActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <com.youth.banner.Banner
            android:id="@+id/banner"
            android:layout_width="match_parent"
            android:layout_height="200dp" />
        <com.jcodecraeer.xrecyclerview.XRecyclerView
            android:id="@+id/xrv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
</ScrollView>

item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/ll"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/sdv"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:background="@mipmap/ic_launcher" />
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/sdv"
            android:text="1111" />
        <TextView
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="2222" />
    </RelativeLayout>
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="1111" />
    <TextView
        android:id="@+id/xing"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="333" />
</LinearLayout>

SecondActivity

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;

import com.bwie.test.adapter.HomePageAdapter;
import com.bwie.test.bean.HomePageBean;
import com.bwie.test.bean.LiebiaoBean;
import com.bwie.test.module.HttpModule;
import com.bwie.test.mysecond01.base.BaseActivity;
import com.bwie.test.mysecond01.homeimage.HomePagePresenter;
import com.bwie.test.mysecond01.homeimage.HomepageContent;
import com.bwie.test.net.GlideImageLoader;
import com.bwie.test.presenter.DaggerHttpModulePenotent;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import com.youth.banner.Banner;
import com.youth.banner.listener.OnBannerListener;

import java.util.ArrayList;
import java.util.List;

public class SecondActivity extends BaseActivity<HomePagePresenter> implements HomepageContent.View {
    private Banner mBanner;
    private XRecyclerView mXrv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();//初始化
        mPresenter.homepagePresenter();
        mPresenter.homeliebiaoPresenter();
    }

    @Override
    public int getContentLayout() {
        return R.layout.activity_second;
    }

    @Override
    public void inject() {
        DaggerHttpModulePenotent.builder()
                .httpModule(new HttpModule())
                .build()
                .inject(this);
    }

    @Override
    public void homepageView(HomePageBean homePageBean) {
        //List<ListBeasn.DataBean.DataBean> datasBeans = (List<ListBean.DataBean.DatasBean>) 
       //listBean.getData();
        mBanner.setImageLoader(new GlideImageLoader());
        final List<HomePageBean.DataBean> data = homePageBean.getData();
        List<String> list=new ArrayList<>();
        for (int i = 0; i <data.size() ; i++) {
            list.add(data.get(i).getImagePath());
        }
        mBanner.setImages(list);
        mBanner.start();
        mBanner.setOnBannerListener(new OnBannerListener() {
            @Override
            public void OnBannerClick(int position) {
//                Intent intent=new Intent(SecondActivity.this,WebActivity.class);
//                intent.putExtra("link",data.get(position).getUrl());
//                startActivity(intent);
            }
        });
    }

    @Override
    public void liebiaoView(LiebiaoBean liebiaoBean) {
        final List<LiebiaoBean.DataBean.DatasBean> datas = liebiaoBean.getData().getDatas();
        mXrv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        HomePageAdapter homePageAdapter = new HomePageAdapter(this,datas);
        mXrv.setAdapter(homePageAdapter);

        homePageAdapter.getIteam(new HomePageAdapter.SetIteamOnclick1() {
            @Override
            public void setOnclick1(int position) {
//                Intent intent=new Intent(SecondActivity.this,WebActivity.class);
//                intent.putExtra("link",datas.get(position).getLink());
//                startActivity(intent);
            }
        });
    }

    private void initView() {
        mBanner = (Banner) findViewById(R.id.banner);
        mXrv = (XRecyclerView) findViewById(R.id.xrv);
        mXrv.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mBanner.stopAutoPlay();
    }
}

app文件夹下MyApplication

import android.app.Application;
import com.facebook.drawee.backends.pipeline.Fresco;

public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        //初始化fresco
        Fresco.initialize(this);
    }
}

homeimage文件夹下HomepageContent

import com.bwie.test.bean.HomePageBean;
import com.bwie.test.bean.LiebiaoBean;
import com.bwie.test.mysecond01.base.BaseContent;

public interface HomepageContent {
    interface View extends BaseContent.BaseView {
       void homepageView(HomePageBean homePageBean);
        void liebiaoView(LiebiaoBean liebiaoBean);
    }

    interface Presenter extends BaseContent.BasePresenter<View>{
        void homepagePresenter();
        void homeliebiaoPresenter();
    }
}

HomePagePresenter

import com.bwie.test.bean.HomePageBean;
import com.bwie.test.bean.LiebiaoBean;
import com.bwie.test.mysecond01.base.BasePresenter;
import com.bwie.test.utils.HomePageApi;
import com.bwie.test.utils.LiebiaoApi;

import javax.inject.Inject;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class HomePagePresenter extends BasePresenter<HomepageContent.View> 
                          implements HomepageContent.Presenter {
    HomePageApi homePageApi;
    LiebiaoApi liebiaoApi;

    @Inject
    public HomePagePresenter(HomePageApi homePageApi,LiebiaoApi liebiaoApi) {
        this.homePageApi = homePageApi;
        this.liebiaoApi=liebiaoApi;
    }

  @Override
    public void homepagePresenter() {
      homePageApi.gethomeService()
              .observeOn(AndroidSchedulers.mainThread())
              .subscribeOn(Schedulers.io())
              .subscribe(new Observer<HomePageBean>() {
                  @Override
                  public void onSubscribe(Disposable d) {

                  }

                  @Override
                  public void onNext(HomePageBean homePageBean) {
                      if (mView!=null){
                          mView.homepageView(homePageBean);
                      }
                  }

                  @Override
                  public void onError(Throwable e) {

                  }

                  @Override
                  public void onComplete() {

                  }
              });
    }

    @Override
    public void homeliebiaoPresenter() {
        liebiaoApi.getSerrvice()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<LiebiaoBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(LiebiaoBean liebiaoBean) {
                        if (mView!=null){
                            mView.liebiaoView(liebiaoBean);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

base文件夹下BaseActivity

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.bwie.test.net.IBase;
import javax.inject.Inject;

public abstract class BaseActivity<T extends BaseContent.BasePresenter> extends AppCompatActivity
                             implements BaseContent.BaseView,IBase {
   @Inject
   protected T mPresenter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentLayout());
        inject();
        mPresenter.attachView(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mPresenter.datechView();
    }
}

BaseContent

public interface BaseContent {
    interface BaseView{
    }

    interface BasePresenter<T extends BaseView>{
        void attachView(T view);
        void datechView();
    }
}

BasePresenter

public class BasePresenter<T extends BaseContent.BaseView> implements BaseContent.BasePresenter<T> {
    public T mView;

    @Override
    public void attachView(T view) {
        if (view!=null){
            this.mView=view;
        }
    }

    @Override
    public void datechView() {
        if (mView!=null){
            mView=null;
        }
    }
}

adapter文件夹下HomePageAdapter

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bwie.test.bean.LiebiaoBean;
import com.bwie.test.mysecond01.R;
import java.util.ArrayList;
import java.util.List;

public class HomePageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<LiebiaoBean.DataBean.DatasBean> list;
    private Context context;
    private LayoutInflater inflater;
    private SetIteamOnclick1 setIteamOnclick1;

    public interface SetIteamOnclick1{
        void setOnclick1(int position);
    }

    public HomePageAdapter( Context context,List<LiebiaoBean.DataBean.DatasBean> list) {
       this.list=list;
        this.context = context;
        inflater=LayoutInflater.from(context);
    }
    /*public void shuaxin(List<LiebiaoBean.DataBean.DatasBean> list){
        this.list.clear();
        this.list.addAll(list);
        notifyDataSetChanged();
    }
    public void jia(List<LiebiaoBean.DataBean.DatasBean> list){
        //this.list.clear();
        this.list.addAll(list);
        notifyDataSetChanged();
    }*/
    public void getIteam(SetIteamOnclick1 setIteamOnclick1) {
        this.setIteamOnclick1 = setIteamOnclick1;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view =inflater.inflate(R.layout.item, parent, false);
        ViewHolder holder=new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        ViewHolder holder1= (ViewHolder) holder;
        holder1.name.setText(list.get(position).getAuthor());
        holder1.time.setText(list.get(position).getNiceDate());
        holder1.title.setText(list.get(position).getTitle());
        holder1.xing.setText(list.get(position).getSuperChapterName());
        holder1.ll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (setIteamOnclick1!=null) {
                    setIteamOnclick1.setOnclick1(position);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        private final TextView name;
        private final TextView time;
        private final TextView title;
        private final TextView xing;
        private final LinearLayout ll;

        public ViewHolder(View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
            time = itemView.findViewById(R.id.time);
            title = itemView.findViewById(R.id.title);
            xing = itemView.findViewById(R.id.xing);
            ll = itemView.findViewById(R.id.ll);
        }
    }
}

module文件夹下HttpModule

import com.bwie.test.utils.Api;
import com.bwie.test.utils.HomePageApi;
import com.bwie.test.utils.HomepageApiService;
import com.bwie.test.utils.LiebiaoApi;
import com.bwie.test.utils.LiebiaoService;

import java.util.concurrent.TimeUnit;
import dagger.Module;
import dagger.Provides;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

@Module
public class HttpModule {
    @Provides
    OkHttpClient.Builder proviteOkHttpClient(){
        return new OkHttpClient.Builder()
                     .connectTimeout(10, TimeUnit.SECONDS)
                     .readTimeout(15,TimeUnit.SECONDS)
                     .writeTimeout(15,TimeUnit.SECONDS);
    }

    @Provides
    HomePageApi proviteHomePageApi(OkHttpClient.Builder builder){
        HomepageApiService homepageApiService = new Retrofit.Builder()
                .baseUrl(Api.HomePAGE)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .client(builder.build())
                .build()
                .create(HomepageApiService.class);
        return HomePageApi.getHomePageApi(homepageApiService);
    }

    @Provides
    LiebiaoApi proviteLiebiaoApi(OkHttpClient.Builder builder){
        LiebiaoService liebiaoService = new Retrofit.Builder()
                .baseUrl(Api.HomePAGE)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .client(builder.build())
                .build()
                .create(LiebiaoService.class);
        return LiebiaoApi.getLiebiao(liebiaoService);
    }
}

presenter文件夹下HttpModulePenotent

import com.bwie.test.module.HttpModule;
import com.bwie.test.mysecond01.SecondActivity;
import javax.inject.Inject;
import dagger.Component;
import dagger.Module;

@Component(modules = HttpModule.class)
public interface HttpModulePenotent {
    void inject(SecondActivity secondActivity);
}

utils文件夹下Api

public interface Api {
    String HomePAGE="http://www.wanandroid.com/";
}

HomepageApiService

import com.bwie.test.bean.HomePageBean;
import io.reactivex.Observable;
import retrofit2.http.GET;

public interface HomepageApiService {
    @GET("banner/json")
    Observable<HomePageBean> gethomeService();
}

HomepageApi

import com.bwie.test.bean.HomePageBean;
import io.reactivex.Observable;

public class HomePageApi {
    private static HomePageApi homePageApi;
    private HomepageApiService homepageApiService;

    public HomePageApi(HomepageApiService homepageApiService) {
        this.homepageApiService = homepageApiService;
    }

    public static HomePageApi getHomePageApi(HomepageApiService homepageApiService){
        if (homePageApi==null){
            homePageApi=new HomePageApi(homepageApiService);
        }
        return homePageApi;
    }

    public Observable<HomePageBean> gethomeService(){
        return homepageApiService.gethomeService();
    }
}

LiebiaoService

import com.bwie.test.bean.LiebiaoBean;
import io.reactivex.Observable;
import retrofit2.http.GET;

public interface LiebiaoService {
    @GET("article/list/0/json")
    Observable<LiebiaoBean> getLieService();
}

LiebiaoApi

import com.bwie.test.bean.LiebiaoBean;
import io.reactivex.Observable;

public class LiebiaoApi {
    private static LiebiaoApi liebiaoApi;
    private LiebiaoService liebiaoService;

    public LiebiaoApi(LiebiaoService liebiaoService) {
        this.liebiaoService = liebiaoService;
    }

    public static LiebiaoApi getLiebiao(LiebiaoService liebiaoService){
        if (liebiaoApi==null){
            liebiaoApi=new LiebiaoApi(liebiaoService);
        }
        return liebiaoApi;
    }

    public Observable<LiebiaoBean> getSerrvice(){
        return liebiaoService.getLieService();
    }
}

net文件夹下IBase

public interface IBase {
    int getContentLayout();
    void inject();
}

GlideImageLoader

import android.content.Context;
import android.net.Uri;
import android.widget.ImageView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.youth.banner.loader.ImageLoader;

public class GlideImageLoader extends ImageLoader {
    @Override
    public void displayImage(Context context, Object path, ImageView imageView) {
        Uri uri=Uri.parse((String) path);
        imageView.setImageURI(uri);
    }

    @Override
    public ImageView createImageView(Context context) {
        return new SimpleDraweeView(context);
    }
}

bean文件夹下HomePageBean

import java.util.List;

public class HomePageBean {

    private int errorCode;
    private String errorMsg;
    private List<DataBean> data;

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {

        private String desc;
        private int id;
        private String imagePath;
        private int isVisible;
        private int order;
        private String title;
        private int type;
        private String url;

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getImagePath() {
            return imagePath;
        }

        public void setImagePath(String imagePath) {
            this.imagePath = imagePath;
        }

        public int getIsVisible() {
            return isVisible;
        }

        public void setIsVisible(int isVisible) {
            this.isVisible = isVisible;
        }

        public int getOrder() {
            return order;
        }

        public void setOrder(int order) {
            this.order = order;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

LiebiaoBean

import java.util.List;

public class LiebiaoBean {

    private DataBean data;
    private int errorCode;
    private String errorMsg;

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public static class DataBean {

        private int curPage;
        private int offset;
        private boolean over;
        private int pageCount;
        private int size;
        private int total;
        private List<DatasBean> datas;

        public int getCurPage() {
            return curPage;
        }

        public void setCurPage(int curPage) {
            this.curPage = curPage;
        }

        public int getOffset() {
            return offset;
        }

        public void setOffset(int offset) {
            this.offset = offset;
        }

        public boolean isOver() {
            return over;
        }

        public void setOver(boolean over) {
            this.over = over;
        }

        public int getPageCount() {
            return pageCount;
        }

        public void setPageCount(int pageCount) {
            this.pageCount = pageCount;
        }

        public int getSize() {
            return size;
        }

        public void setSize(int size) {
            this.size = size;
        }

        public int getTotal() {
            return total;
        }

        public void setTotal(int total) {
            this.total = total;
        }

        public List<DatasBean> getDatas() {
            return datas;
        }

        public void setDatas(List<DatasBean> datas) {
            this.datas = datas;
        }

        public static class DatasBean {

            private String apkLink;
            private String author;
            private int chapterId;
            private String chapterName;
            private boolean collect;
            private int courseId;
            private String desc;
            private String envelopePic;
            private boolean fresh;
            private int id;
            private String link;
            private String niceDate;
            private String origin;
            private String projectLink;
            private long publishTime;
            private int superChapterId;
            private String superChapterName;
            private String title;
            private int type;
            private int userId;
            private int visible;
            private int zan;
            private List<?> tags;

            public String getApkLink() {
                return apkLink;
            }

            public void setApkLink(String apkLink) {
                this.apkLink = apkLink;
            }

            public String getAuthor() {
                return author;
            }

            public void setAuthor(String author) {
                this.author = author;
            }

            public int getChapterId() {
                return chapterId;
            }

            public void setChapterId(int chapterId) {
                this.chapterId = chapterId;
            }

            public String getChapterName() {
                return chapterName;
            }

            public void setChapterName(String chapterName) {
                this.chapterName = chapterName;
            }

            public boolean isCollect() {
                return collect;
            }

            public void setCollect(boolean collect) {
                this.collect = collect;
            }

            public int getCourseId() {
                return courseId;
            }

            public void setCourseId(int courseId) {
                this.courseId = courseId;
            }

            public String getDesc() {
                return desc;
            }

            public void setDesc(String desc) {
                this.desc = desc;
            }

            public String getEnvelopePic() {
                return envelopePic;
            }

            public void setEnvelopePic(String envelopePic) {
                this.envelopePic = envelopePic;
            }

            public boolean isFresh() {
                return fresh;
            }

            public void setFresh(boolean fresh) {
                this.fresh = fresh;
            }

            public int getId() {
                return id;
            }

            public void setId(int id) {
                this.id = id;
            }

            public String getLink() {
                return link;
            }

            public void setLink(String link) {
                this.link = link;
            }

            public String getNiceDate() {
                return niceDate;
            }

            public void setNiceDate(String niceDate) {
                this.niceDate = niceDate;
            }

            public String getOrigin() {
                return origin;
            }

            public void setOrigin(String origin) {
                this.origin = origin;
            }

            public String getProjectLink() {
                return projectLink;
            }

            public void setProjectLink(String projectLink) {
                this.projectLink = projectLink;
            }

            public long getPublishTime() {
                return publishTime;
            }

            public void setPublishTime(long publishTime) {
                this.publishTime = publishTime;
            }

            public int getSuperChapterId() {
                return superChapterId;
            }

            public void setSuperChapterId(int superChapterId) {
                this.superChapterId = superChapterId;
            }

            public String getSuperChapterName() {
                return superChapterName;
            }

            public void setSuperChapterName(String superChapterName) {
                this.superChapterName = superChapterName;
            }

            public String getTitle() {
                return title;
            }

            public void setTitle(String title) {
                this.title = title;
            }

            public int getType() {
                return type;
            }

            public void setType(int type) {
                this.type = type;
            }

            public int getUserId() {
                return userId;
            }

            public void setUserId(int userId) {
                this.userId = userId;
            }

            public int getVisible() {
                return visible;
            }

            public void setVisible(int visible) {
                this.visible = visible;
            }

            public int getZan() {
                return zan;
            }

            public void setZan(int zan) {
                this.zan = zan;
            }

            public List<?> getTags() {
                return tags;
            }

            public void setTags(List<?> tags) {
                this.tags = tags;
            }
        }
    }
}