使用的依赖和权限
implementation 'com.facebook.fresco:fresco:1.9.0' //添加retrofit依赖 implementation 'com.squareup.retrofit2:retrofit:2.4.0' //添加gson转换器的依赖 implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //RXJava的依赖 implementation 'io.reactivex.rxjava2:rxjava:2.1.10' //RXJava安卓的依赖 implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' //注意 rxjava2是2.0的 不加2表示的是1.0 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.4-7' implementation 'com.android.support:design:27.1.1' implementation 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.jakewharton:butterknife:8.8.1' implementation 'com.hjm:BottomTabBar:1.1.1'
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/>
build.gradle
dependencies { classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' }
activity_main
<?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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <com.hjm.bottomtabbar.BottomTabBar android:id="@+id/bottom_tab_bar" android:layout_width="match_parent" android:layout_height="match_parent"> </com.hjm.bottomtabbar.BottomTabBar> </LinearLayout>
fragmentduanzi
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@android:color/holo_blue_dark"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="段子" android:layout_gravity="center" android:textSize="24dp" android:textColor="@android:color/white"/> </LinearLayout> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/smart_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout> </ScrollView> </com.scwang.smartrefresh.layout.SmartRefreshLayout> </LinearLayout>
duanzi_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <com.facebook.drawee.view.SimpleDraweeView android:background="@drawable/icon_failure" android:id="@+id/simple_view" android:layout_width="100dp" android:layout_height="100dp" fresco:backgroundImage="@drawable/icon_failure" fresco:roundAsCircle="true" /> <LinearLayout android:layout_margin="6dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> <TextView android:id="@+id/tv_neirong" android:layout_margin="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/simp_datu" android:background="@drawable/icon_failure" android:layout_width="500dp" fresco:backgroundImage="@drawable/icon_failure" android:layout_height="150dp" /> </LinearLayout>
fragmentfaixian
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="发现" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
fragmentshiping
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="视频" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
fragmentttuijian
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="推荐" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
drawable文件夹下check_selector
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/holo_red_dark" android:state_checked="true"></item> <item android:drawable="@android:color/white" android:state_checked="false"></item> <item android:drawable="@android:color/white"></item> </selector>
MainActivity
import android.graphics.Color; import android.support.annotation.Nullable; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.RadioGroup; import com.bwie.test.fragment.FragmentDuanZi; import com.bwie.test.fragment.FragmentFaiXian; import com.bwie.test.fragment.FragmentShiPin; import com.bwie.test.fragment.FragmentTuiJIan; import com.hjm.bottomtabbar.BottomTabBar; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { private BottomTabBar bottomTabBar; @BindView(R.id.radio) RadioGroup radio; private FragmentTuiJIan fragmentTuiJIan; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bottomTabBar = findViewById(R.id.bottom_tab_bar); //初始化Fragment bottomTabBar.init(getSupportFragmentManager()) .setImgSize(50, 50) //图片大小 .setFontSize(12) //字体大小 .setTabPadding(4, 6, 10)//选项卡的间距 .setChangeColor(Color.RED, Color.BLUE) //选项卡的选择颜色 .addTabItem("首页", R.drawable.x_sy_b, FragmentTuiJIan.class) .addTabItem("分类", R.drawable.x_dz_b, FragmentDuanZi.class) .addTabItem("发现", R.drawable.x_sp_b, FragmentFaiXian.class) .addTabItem("我的", R.drawable.x_wd_b, FragmentShiPin.class) .isShowDivider(true) //是否包含分割线 .setOnTabChangeListener(new BottomTabBar.OnTabChangeListener() { @Override public void onTabChange(int position, String name) { Log.i("TGA", "位置:" + position + " 选项卡:" + name); } }); } }
app文件夹下MyApp
import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
inter_view文件夹下IDuanZiFragment
import com.bwie.test.bean.JokesBean; public interface IDuanZiFragment { void onSuccess(JokesBean JokesBean); void onError(Throwable throwable); }
adapter文件夹下DuanZiHolder
import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.bwie.test.jinfengkai20180514.R; import butterknife.BindView; import butterknife.ButterKnife; public class DuanZiHolder extends RecyclerView.ViewHolder{ @BindView(R.id.simple_view) public SimpleDraweeView simple_view; @BindView(R.id.tv_name) public TextView tv_name; @BindView(R.id.tv_neirong) public TextView tv_neirong; @BindView(R.id.tv_time) public TextView tv_time; @BindView(R.id.simp_datu) public SimpleDraweeView simp_datu; public DuanZiHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }
DuanZiAdapter
import android.content.Context; import android.net.Uri; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import com.bwie.test.adapter.holder.DuanZiHolder; import com.bwie.test.bean.JokesBean; import com.bwie.test.jinfengkai20180514.R; import java.util.List; public class DuanZiAdapter extends RecyclerView.Adapter<DuanZiHolder>{ private Context context; private List<JokesBean.DataBean> data; public DuanZiAdapter(Context context, List<JokesBean.DataBean> data) { this.context = context; this.data = data; } @NonNull @Override public DuanZiHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.duanzi_item,null); DuanZiHolder holder = new DuanZiHolder(view); return holder; } @Override public void onBindViewHolder(@NonNull DuanZiHolder holder, int position) { holder.tv_neirong.setText(data.get(position).getContent()); holder.tv_time.setText(data.get(position).getCreateTime()); holder.tv_name.setText(data.get(position).getUser().getNickname()); Object icon = data.get(position).getUser().getIcon(); Uri uri = Uri.parse(String.valueOf(icon)); holder.simple_view.setImageURI(uri); Uri uri1 = Uri.parse(String.valueOf(data.get(position).getImgUrls())); holder.simp_datu.setImageURI(uri1); } @Override public int getItemCount() { return data.size(); } }
model文件夹下BaseModel
import java.util.Map; public interface BaseModel { void getDataFromNet(String url, Map<String, String> map); void unsubcribe(); }
DuanziFragmentModel
import com.bwie.test.bean.JokesBean; import com.bwie.test.presenter.IDuanZiPresenter; import com.bwie.test.utils.RestoUtils; import java.util.Map; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class DuanziFragmentModel implements BaseModel{ private IDuanZiPresenter prensenterInter; private Disposable d; public DuanziFragmentModel(IDuanZiPresenter prensenterInter) { this.prensenterInter = prensenterInter; } @Override public void getDataFromNet(String url, Map<String, String> map) { RestoUtils.getService().doPost(url,map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<JokesBean>() { @Override public void onSubscribe(Disposable d) { DuanziFragmentModel.this.d = d; } @Override public void onNext(JokesBean jokesBean) { //回传数据 prensenterInter.onSuccess(jokesBean); } @Override public void onError(Throwable e) { prensenterInter.onError(e); } @Override public void onComplete() { } }); } @Override public void unsubcribe() { d.dispose(); } }
presenter文件夹下BasePresenter
import java.lang.ref.Reference; import java.lang.ref.WeakReference; public abstract class BasePresenter<T> { protected Reference<T> mViewRef;//View接口类型弱引用 public void attachView(T view) { mViewRef = new WeakReference<>(view); //建立关联 } protected T getView() { return mViewRef.get();//获取View } public boolean isViewAttached() {//判断是否与View建立了关联 return mViewRef != null && mViewRef.get() != null; } public void detachView() {//解除关联 if (mViewRef != null) { mViewRef.clear(); mViewRef = null; } } }
DuanziPresenter
package com.bwie.test.presenter; import com.bwie.test.bean.JokesBean; import com.bwie.test.jinfengkai20180514.inter.IDuanZiFragment; import com.bwie.test.model.DuanziFragmentModel; import java.util.Map; public class DuanziPresenter extends BasePresenter implements IDuanZiPresenter{ private DuanziFragmentModel duanziFragmentModel; private IDuanZiFragment iDuanZiFragment; public DuanziPresenter(IDuanZiFragment iDuanZiFragment) { this.iDuanZiFragment = iDuanZiFragment; duanziFragmentModel = new DuanziFragmentModel(this); } @Override public void getDataFromNet(String url, Map<String, String> map) { duanziFragmentModel.getDataFromNet(url, map); } @Override public void unsubcribe() { duanziFragmentModel.unsubcribe(); } @Override public void onSuccess(JokesBean JokesBean) { iDuanZiFragment.onSuccess(JokesBean); } @Override public void onError(Throwable throwable) { iDuanZiFragment.onError(throwable); } }
IDuanZiPresenter
import com.bwie.test.bean.JokesBean; import java.util.Map; public interface IDuanZiPresenter { void getDataFromNet(String url, Map<String, String> map); void unsubcribe(); void onSuccess(JokesBean JokesBean); void onError(Throwable throwable); }
fragment文件夹下FragmentDuanZi
import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.bwie.test.adapter.DuanZiAdapter; import com.bwie.test.bean.JokesBean; import com.bwie.test.jinfengkai20180514.R; import com.bwie.test.jinfengkai20180514.inter.IDuanZiFragment; import com.bwie.test.presenter.DuanziPresenter; import com.bwie.test.utils.Constant; import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener; import com.scwang.smartrefresh.layout.listener.OnRefreshListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; public class FragmentDuanZi extends Fragment implements IDuanZiFragment { @BindView(R.id.smart_layout) SmartRefreshLayout smart_layout; @BindView(R.id.recycler_view) RecyclerView recycler_view; private DuanziPresenter duanziFragmentP; List<JokesBean.DataBean> data = new ArrayList<>(); int page = 1; private Map<String, String> map; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.fragmentduanzi,container,false); ButterKnife.bind(this,view); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //创建中间者 duanziFragmentP = new DuanziPresenter(this); getData(); smart_layout.setOnLoadmoreListener(new OnLoadmoreListener() { @Override public void onLoadmore(RefreshLayout refreshlayout) { page++; duanziFragmentP.getDataFromNet(Constant.jokesUrl,map); } }); smart_layout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(RefreshLayout refreshlayout) { page=1; data.clear(); duanziFragmentP.getDataFromNet(Constant.jokesUrl,map); } }); } public void getData() { map = new HashMap<>(); map.put("source","android"); map.put("appVersion","101"); map.put("page", String.valueOf(page)); duanziFragmentP.getDataFromNet(Constant.jokesUrl,map); } @Override public void onSuccess(JokesBean JokesBean) { data= JokesBean.getData(); Log.e("----",JokesBean.getMsg()); //创建适配器 DuanZiAdapter duanZiAdapter=new DuanZiAdapter(getActivity(),data); recycler_view.setAdapter(duanZiAdapter); recycler_view.setLayoutManager(new LinearLayoutManager(getActivity())); //停止刷新和下拉加载 smart_layout.finishLoadmore(); smart_layout.finishRefresh(); } @Override public void onError(Throwable throwable) { Log.e("----",throwable.getMessage()); } @Override public void onDestroy() { super.onDestroy(); duanziFragmentP.unsubcribe();//解除订阅 if (duanziFragmentP.isViewAttached()){//如果产生关联 duanziFragmentP.detachView(); //解除关联 } } }
FragmentFaiXian
import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.bwie.test.jinfengkai20180514.R; public class FragmentFaiXian extends Fragment{ @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentfaixian,container,false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
FragmentShiPing
import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.bwie.test.jinfengkai20180514.R; public class FragmentShiPin extends Fragment{ @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentshiping,container, false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
FragmentTuiJian
import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.bwie.test.jinfengkai20180514.R; public class FragmentTuiJIan extends Fragment{ @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentttuijian,container, false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
utils文件夹下ApiService
import com.bwie.test.bean.JokesBean; import java.util.Map; import io.reactivex.Observable; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Path; import retrofit2.http.QueryMap; public interface ApiService { @GET("{url}") Observable<JokesBean> doGet(@Path(value = "url", encoded = true) String url, @QueryMap Map<String, String> map); @FormUrlEncoded @POST("{url}") Observable<JokesBean> doPost(@Path(value = "url", encoded = true) String url, @FieldMap Map<String, String> map); }
Constant
public class Constant { public static String baseUrl="https://www.zhaoapi.cn/"; public static String jokesUrl="quarter/getJokes"; }
RestoUtils
import android.util.Log; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class RestoUtils { private static RestoUtils restoUtils = null; private Retrofit retrofit; public RestoUtils() { } public RestoUtils(String baseUrl) { OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new CommonParamsInterceptor()) .connectTimeout(15, TimeUnit.SECONDS) .build(); retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } public <T> T CreateService(Class<T> service) { return retrofit.create(service); } /** * 单例模式 * @param baseUrl * @return */ public static RestoUtils getInstans(String baseUrl) { if (restoUtils == null) { synchronized (RestoUtils.class) { if (restoUtils == null) { restoUtils = new RestoUtils(baseUrl); } } } return restoUtils; } public static ApiService getService(){ return RestoUtils.getInstans(Constant.baseUrl).CreateService( ApiService.class ); } /** * 公共参数的拦截器 */ private static class CommonParamsInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String method = request.method(); String oldUrl = request.url().toString(); Log.e("----oldUrl", oldUrl); Map<String, String> map = new HashMap<>(); map.put("source", "android"); if ("GET".equals(method)) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(oldUrl); if (oldUrl.contains("?")) { if (oldUrl.indexOf("?") == oldUrl.length() - 1) { } else { stringBuilder.append("&"); } } else { stringBuilder.append("?"); } for (Map.Entry<String, String> entry : map.entrySet()) { stringBuilder.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } if (stringBuilder.indexOf("&") != -1) { stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&")); } String newUrl = stringBuilder.toString(); Log.e("----newUrl", newUrl); request = request.newBuilder().url(newUrl).build(); } else if ("POST".equals(method)) { RequestBody requestBody = request.body(); if (requestBody instanceof FormBody) { FormBody oldBody = (FormBody) requestBody; FormBody.Builder builder = new FormBody.Builder(); for (int i = 0; i < oldBody.size(); i++) { builder.add(oldBody.name(i), oldBody.value(i)); } for (Map.Entry<String, String> entry : map.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } request = request.newBuilder().url(oldUrl).post(builder.build()) .build(); } } Response response = chain.proceed(request); return response; } } }
bean文件夹下JokesBean
import java.util.List; public class JokesBean { private String msg; private String code; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { private Object commentNum; private String content; private String createTime; private Object imgUrls; private int jid; private Object praiseNum; private Object shareNum; private int uid; private UserBean user; public Object getCommentNum() { return commentNum; } public void setCommentNum(Object commentNum) { this.commentNum = commentNum; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public Object getImgUrls() { return imgUrls; } public void setImgUrls(Object imgUrls) { this.imgUrls = imgUrls; } public int getJid() { return jid; } public void setJid(int jid) { this.jid = jid; } public Object getPraiseNum() { return praiseNum; } public void setPraiseNum(Object praiseNum) { this.praiseNum = praiseNum; } public Object getShareNum() { return shareNum; } public void setShareNum(Object shareNum) { this.shareNum = shareNum; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public UserBean getUser() { return user; } public void setUser(UserBean user) { this.user = user; } public static class UserBean { private Object age; private String fans; private boolean follow; private Object icon; private String nickname; private String praiseNum; public Object getAge() { return age; } public void setAge(Object age) { this.age = age; } public String getFans() { return fans; } public void setFans(String fans) { this.fans = fans; } public boolean isFollow() { return follow; } public void setFollow(boolean follow) { this.follow = follow; } public Object getIcon() { return icon; } public void setIcon(Object icon) { this.icon = icon; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPraiseNum() { return praiseNum; } public void setPraiseNum(String praiseNum) { this.praiseNum = praiseNum; } } } }