导依赖
在主build.gradle里加
apply from: "config.gradle"
在app的build.gradle里
apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.android.compileSdkVersion defaultConfig { applicationId rootProject.ext.android.applicationId minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation rootProject.ext.dependencies["appcompat-v7"] implementation rootProject.ext.dependencies["constraint-layout"] implementation rootProject.ext.dependencies["retrofit2"] implementation rootProject.ext.dependencies["converter-gson"] implementation rootProject.ext.dependencies["rxjava2"] implementation rootProject.ext.dependencies["rxjava2:rxandroid"] implementation rootProject.ext.dependencies["dagger"] annotationProcessor rootProject.ext.dependencies["dagger-compiler"] implementation rootProject.ext.dependencies["adapter-rxjava"] implementation 'com.sunfusheng:marqueeview:1.3.3' implementation 'com.jcodecraeer:xrecyclerview:1.3.2' implementation 'com.youth.banner:banner:1.4.10' implementation 'com.android.support:design:27.1.1' implementation 'com.hjm:BottomTabBar:1.1.1' implementation 'com.facebook.fresco:fresco:0.12.0' // 支持 GIF 动图,需要添加 implementation 'com.facebook.fresco:animated-gif:0.12.0' }
加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
base包
package com.example.administrator.yizhoumoni.base; /** * Created by Administrator on 2018/5/12 0012. */ public interface BaseContract { //抽取所有presenter的共性,例如绑定、解绑 interface BasePresenter<T extends BaseView>{ void attchView(T view); void detachView(); } interface BaseView{ } }
package com.example.administrator.yizhoumoni.base; /** * Created by Administrator on 2018/5/12 0012. */ public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> { protected T mTiew; @Override public void attchView(T view) { this.mTiew=view; } @Override public void detachView() { if (mTiew!=null){ mTiew=null; } } }
package com.example.administrator.yizhoumoni.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import com.example.administrator.yizhoumoni.inter.IBase; import javax.inject.Inject; /** * Created by Administrator on 2018/5/12 0012. */ public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends AppCompatActivity implements IBase,BaseContract.BaseView { @Inject protected T mPresenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentLayout()); inject(); mPresenter.attchView(this); } @Override protected void onDestroy() { super.onDestroy(); mPresenter.detachView(); } }
inter包
package com.example.administrator.yizhoumoni.inter; /** * Created by Administrator on 2018/5/12 0012. */ public interface IBase { int getContentLayout(); void inject(); }
net包
package com.example.administrator.yizhoumoni.net; /** * Created by Administrator on 2018/5/12 0012. */ public interface API { String BASEURL="https://www.zhaoapi.cn"; }
package com.example.administrator.yizhoumoni.net; import com.example.administrator.yizhoumoni.bean.JokesBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; /** * Created by Administrator on 2018/5/12 0012. */ public interface JokesApiService { @FormUrlEncoded @POST("quarter/getJokes ") Observable<JokesBean> getJokes(@Field("page") String page); }
package com.example.administrator.yizhoumoni.net; import com.example.administrator.yizhoumoni.bean.JokesBean; import io.reactivex.Observable; /** * Created by Administrator on 2018/5/12 0012. */ public class JokesApi { private static JokesApi jokesApi; private JokesApiService jokesApiService; public JokesApi(JokesApiService jokesApiService) { this.jokesApiService=jokesApiService; } public static JokesApi getJokesApi(JokesApiService jokesApiService){ if (jokesApi==null){ jokesApi=new JokesApi(jokesApiService); } return jokesApi; } public Observable<JokesBean> getJokes(String page){ return jokesApiService.getJokes(page); } }
jokes包
package com.example.administrator.yizhoumoni.jokes; import com.example.administrator.yizhoumoni.base.BaseContract; import com.example.administrator.yizhoumoni.bean.JokesBean; /** * Created by Administrator on 2018/5/12 0012. */ public interface JokesContract { interface View extends BaseContract.BaseView{ void jokesSuccess(JokesBean jokesBean); } interface presenter extends BaseContract.BasePresenter<View>{ void getJokes(String page); } }
package com.example.administrator.yizhoumoni.jokes; import com.example.administrator.yizhoumoni.base.BasePresenter; import com.example.administrator.yizhoumoni.bean.JokesBean; import com.example.administrator.yizhoumoni.net.JokesApi; import javax.inject.Inject; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; /** * Created by Administrator on 2018/5/12 0012. */ public class JokesPresenter extends BasePresenter<JokesContract.View> implements JokesContract.presenter { private JokesApi jokesApi; @Inject public JokesPresenter(JokesApi jokesApi) { this.jokesApi=jokesApi; } @Override public void getJokes(String page) { jokesApi.getJokes(page) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer<JokesBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(JokesBean jokesBean) { mTiew.jokesSuccess(jokesBean); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }
module包
package com.example.administrator.yizhoumoni.module; import com.example.administrator.yizhoumoni.net.API; import com.example.administrator.yizhoumoni.net.JokesApi; import com.example.administrator.yizhoumoni.net.JokesApiService; import com.example.administrator.yizhoumoni.ui.MyInterceptor; 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; /** * Created by Administrator on 2018/5/12 0012. */ @Module public class HttpModule { @Provides OkHttpClient.Builder provideOkHttpClientBuilder() { return new OkHttpClient.Builder() .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS); } @Provides JokesApi provideJokesApi(OkHttpClient.Builder builder){ builder.addInterceptor(new MyInterceptor()); Retrofit retrofit = new Retrofit.Builder().baseUrl(API.BASEURL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(builder.build()) .build(); JokesApiService jokesApiService = retrofit.create(JokesApiService.class); return JokesApi.getJokesApi(jokesApiService); } }
component包
package com.example.administrator.yizhoumoni.component; import com.example.administrator.yizhoumoni.MainActivity; import com.example.administrator.yizhoumoni.module.HttpModule; import dagger.Component; /** * Created by Administrator on 2018/5/12 0012. */ @Component(modules = HttpModule.class) public interface HttpComponent { void inject(MainActivity mainActivity); }
拦截器
package com.example.administrator.yizhoumoni.ui; import java.io.IOException; import okhttp3.FormBody; import okhttp3.HttpUrl; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; /** * Created by Administrator on 2018/5/12 0012. */ public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Response response; //区分是GET请求还是POST请求 Request originRequest = chain.request(); if ("GET".equals(originRequest.method())) { HttpUrl httpUrl = originRequest.url() .newBuilder() .addQueryParameter("source", "android") .addQueryParameter("appVersion","101") .build(); Request request = new Request.Builder().url(httpUrl).build(); //发送请求 response = chain.proceed(request); } else { FormBody.Builder builder = new FormBody.Builder(); FormBody body = (FormBody) originRequest.body(); int size = body.size(); for (int i = 0; i < size; i++) { builder.add(body.name(i), body.value(i)); } builder.add("source", "android"); builder.add("appVersion","101"); FormBody formBody = builder.build(); Request request = new Request.Builder() .url(originRequest.url()) .post(formBody) .build(); response = chain.proceed(request); } return response; } }
app包
package com.example.administrator.yizhoumoni.app; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; /** * Created by Administrator on 2018/5/12 0012. */ public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
bean包
package com.example.administrator.yizhoumoni.bean; import java.util.List; /** * Created by Administrator on 2018/5/12 0012. */ public class JokesBean { /** * msg : 获取段子列表成功 * code : 0 * data : [{"commentNum":null,"content":"早上好","createTime":"2018-05-11T07:52:37","imgUrls":"https://www.zhaoapi.cn/images/quarter/15259963574562018-05-11_07-52-06.jpg","jid":2608,"praiseNum":null,"shareNum":null,"uid":12509,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1523839244885crop_photo.jpg","nickname":"%E5%BC%A0%E9%9C%B2","praiseNum":"null"}},{"commentNum":null,"content":"楼下的你是谁","createTime":"2018-05-10T11:08:20","imgUrls":null,"jid":2607,"praiseNum":null,"shareNum":null,"uid":11555,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1526040073381image.jpg","nickname":"肤白貌美大长腿","praiseNum":"null"}},{"commentNum":null,"content":"有美人兮,见之不忘,一日不见兮,思之如狂。","createTime":"2018-04-29T09:47:56","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524966476079IMG_PITU_20180427_163105.jpg","jid":2444,"praiseNum":null,"shareNum":null,"uid":12898,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524972479241gaga_icon.jpg","nickname":"晴天","praiseNum":"null"}},{"commentNum":null,"content":"北城别,回眸三生","createTime":"2018-04-29T09:44:12","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524966252515IMG_PITU_20180427_163706.jpg","jid":2443,"praiseNum":null,"shareNum":null,"uid":12898,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524972479241gaga_icon.jpg","nickname":"晴天","praiseNum":"null"}},{"commentNum":null,"content":"你好","createTime":"2018-04-29T09:38:52","imgUrls":null,"jid":2442,"praiseNum":null,"shareNum":null,"uid":12898,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524972479241gaga_icon.jpg","nickname":"晴天","praiseNum":"null"}},{"commentNum":null,"content":"急急急","createTime":"2018-04-29T08:51:57","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524963117808mmqrcode1524905055464.png","jid":2440,"praiseNum":null,"shareNum":null,"uid":11186,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524970642661gaga_icon.jpg","nickname":"啦啦啦","praiseNum":"null"}},{"commentNum":null,"content":"向毛爷爷致敬","createTime":"2018-04-29T08:35:57","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524962157793head_icon.jpg","jid":2439,"praiseNum":null,"shareNum":null,"uid":11186,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524970642661gaga_icon.jpg","nickname":"啦啦啦","praiseNum":"null"}},{"commentNum":null,"content":"鸡翅还吃","createTime":"2018-04-27T19:43:50","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524829430588login.png|https://www.zhaoapi.cn/images/quarter/1524829430588splash.png","jid":2384,"praiseNum":null,"shareNum":null,"uid":12882,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1524901794636head_icon.jpg","nickname":null,"praiseNum":"null"}},{"commentNum":null,"content":"咯rosy","createTime":"2018-04-27T17:06:12","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524819972717avatar-25-27667.jpg|https://www.zhaoapi.cn/images/quarter/1524819972733avatar-14-31491.jpg|https://www.zhaoapi.cn/images/quarter/1524819972733avatar-14-31485.jpg|https://www.zhaoapi.cn/images/quarter/1524819972733avatar-25-29151.jpg","jid":2378,"praiseNum":null,"shareNum":null,"uid":2809,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1525672979819head_icon.jpg","nickname":"孑然","praiseNum":"null"}},{"commentNum":null,"content":"咯rosy","createTime":"2018-04-27T17:06:08","imgUrls":"https://www.zhaoapi.cn/images/quarter/1524819968842avatar-25-27667.jpg|https://www.zhaoapi.cn/images/quarter/1524819968858avatar-14-31491.jpg|https://www.zhaoapi.cn/images/quarter/1524819968858avatar-14-31485.jpg|https://www.zhaoapi.cn/images/quarter/1524819968858avatar-25-29151.jpg","jid":2377,"praiseNum":null,"shareNum":null,"uid":2809,"user":{"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1525672979819head_icon.jpg","nickname":"孑然","praiseNum":"null"}}] */ 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 { /** * commentNum : null * content : 早上好 * createTime : 2018-05-11T07:52:37 * imgUrls : https://www.zhaoapi.cn/images/quarter/15259963574562018-05-11_07-52-06.jpg * jid : 2608 * praiseNum : null * shareNum : null * uid : 12509 * user : {"age":null,"fans":"null","follow":false,"icon":"https://www.zhaoapi.cn/images/1523839244885crop_photo.jpg","nickname":"%E5%BC%A0%E9%9C%B2","praiseNum":"null"} */ private Object commentNum; private String content; private String createTime; private String 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 String getImgUrls() { return imgUrls; } public void setImgUrls(String 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 { /** * age : null * fans : null * follow : false * icon : https://www.zhaoapi.cn/images/1523839244885crop_photo.jpg * nickname : %E5%BC%A0%E9%9C%B2 * praiseNum : null */ private Object age; private String fans; private boolean follow; private String 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 String getIcon() { return icon; } public void setIcon(String 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; } } } }
Main类
package com.example.administrator.yizhoumoni; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.widget.Toast; import com.example.administrator.yizhoumoni.adapter.RvAdapter; import com.example.administrator.yizhoumoni.base.BaseActivity; import com.example.administrator.yizhoumoni.bean.JokesBean; import com.example.administrator.yizhoumoni.component.DaggerHttpComponent; import com.example.administrator.yizhoumoni.jokes.JokesContract; import com.example.administrator.yizhoumoni.jokes.JokesPresenter; import com.example.administrator.yizhoumoni.module.HttpModule; import java.util.List; public class MainActivity extends BaseActivity<JokesPresenter> implements JokesContract.View { private RecyclerView mRv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); mPresenter.getJokes("2"); } private void initView() { mRv = (RecyclerView) findViewById(R.id.rv); mRv.setLayoutManager(new LinearLayoutManager(this)); } @Override public int getContentLayout() { return R.layout.activity_main; } @Override public void inject() { DaggerHttpComponent.builder().httpModule(new HttpModule()).build().inject(this); } @Override public void jokesSuccess(JokesBean jokesBean) { List<JokesBean.DataBean> data = jokesBean.getData(); RvAdapter adapter = new RvAdapter(data,MainActivity.this); mRv.setAdapter(adapter); Log.e("zzzzz",jokesBean.getMsg()); Toast.makeText(this,jokesBean.getMsg(),Toast.LENGTH_LONG).show(); }
}
adapter
package com.example.administrator.yizhoumoni.adapter; import android.content.Context; import android.net.Uri; 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.ImageView; import android.widget.TextView; import com.example.administrator.yizhoumoni.R; import com.example.administrator.yizhoumoni.bean.JokesBean; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; /** * Created by Administrator on 2018/5/12 0012. */ public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<JokesBean.DataBean> data; private Context context; private final LayoutInflater inflater; public RvAdapter(List<JokesBean.DataBean> data, Context context) { this.data = data; this.context = context; inflater = LayoutInflater.from(context); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.item, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ViewHolder viewHolder = (ViewHolder) holder; JokesBean.DataBean dataBean = data.get(position); viewHolder.ivimg.setImageURI(dataBean.getImgUrls()); // viewHolder.img.setImageURI(dataBean.getImgUrls()); viewHolder.tvname.setText(dataBean.getUser().getNickname()); viewHolder.tvtime.setText(dataBean.getCreateTime()); viewHolder.tvtitle.setText(dataBean.getContent()); } @Override public int getItemCount() { return data.size(); } class ViewHolder extends RecyclerView.ViewHolder{ private final TextView tvname; private final TextView tvtime; private final TextView tvtitle; private final SimpleDraweeView ivimg; public ViewHolder(View itemView) { super(itemView); tvname = itemView.findViewById(R.id.tvname); tvtime = itemView.findViewById(R.id.tvtime); tvtitle = itemView.findViewById(R.id.tvtitle); ivimg = itemView.findViewById(R.id.ivimg); } } }