//依赖
implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' //implementation 'com.android.support:design:27.+' implementation 'com.squareup.retrofit2:converter-gson:2.0.2' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.0.2' implementation 'com.squareup.retrofit2:retrofit:2.0.2' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' implementation 'org.greenrobot:greendao:3.2.2' implementation 'com.facebook.fresco:fresco:0.12.0' // 在 API < 14 上的机器支持 WebP 时,需要添加 implementation 'com.facebook.fresco:animated-base-support:0.12.0' // 支持 GIF 动图,需要添加 implementation 'com.facebook.fresco:animated-gif:0.12.0' implementation 'com.jcodecraeer:xrecyclerview:1.5.9' // 支持 WebP (静态图+动图),需要添加 implementation 'com.facebook.fresco:animated-webp:0.12.0' implementation 'com.facebook.fresco:webpsupport:0.12.0'
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.support') { if (!requested.name.startsWith("multidex")) { details.useVersion '27.1.1' } } } }
//Utils
package com.example.ggq.gaoguoqingzhoukao2.utils; import android.util.Log; import com.example.ggq.gaoguoqingzhoukao2.api.api; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class HttpUtils { //成员变量 private static HttpUtils httpUtils; private OkHttpClient okHttpClient; //私有构造 private HttpUtils(){ okHttpClient=new OkHttpClient.Builder() .addInterceptor(new longinterceptor()) .build(); } //拦截器方法 class longinterceptor implements Interceptor{ @Override public Response intercept(Chain chain) throws IOException { //请求对象 Request request = chain.request(); //创建方法 String method = request.method(); //添加日志信息 Log.i("xxx",method+""); //接收铺对象 Response response = chain.proceed(request); return response; } } //单例模式 public static HttpUtils getinstance(){ if (httpUtils==null){ synchronized (HttpUtils.class){ if (httpUtils==null){ httpUtils=new HttpUtils(); } } } return httpUtils; } public api getpost(String base){ Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) //添加拼接地址 .baseUrl(base) //添加retrofit对RXjava 的支持 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //添加gson对象 .addConverterFactory(GsonConverterFactory.create()) .build(); //获取接口 api api = retrofit.create(api.class); return api; } }
/契约接口
package com.example.ggq.gaoguoqingzhoukao2.mvp; import com.example.ggq.gaoguoqingzhoukao2.bean.work; import java.util.List; public interface icontract { public interface iview{ void showdata(List<work> works); } public interface ipresenter<iview>{ //关联 void attachview(iview iview); //取消 void detachview(iview iview); //逻辑方法 void requestinfo(); } public interface imoudel{ //接口 public interface oncalllisten{ //请求方法 void responsemsg(List<work> works); } //方法 void requestdata(oncalllisten oncalllisten); } } //model实现类
package com.example.ggq.gaoguoqingzhoukao2.mvp; import com.example.ggq.gaoguoqingzhoukao2.api.api; import com.example.ggq.gaoguoqingzhoukao2.app.app; import com.example.ggq.gaoguoqingzhoukao2.bean.news; import com.example.ggq.gaoguoqingzhoukao2.bean.work; import com.example.ggq.gaoguoqingzhoukao2.bean.workDao; import com.example.ggq.gaoguoqingzhoukao2.constant.constant; import com.example.ggq.gaoguoqingzhoukao2.utils.HttpUtils; import java.util.ArrayList; import java.util.List; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; public class moudleimp implements icontract.imoudel { @Override public void requestdata(final oncalllisten oncalllisten) { //获取数据库 final workDao workDao = app.getinstance().getDaoSession().getWorkDao(); //全查 List<work> works = workDao.loadAll(); //判断 if (works.size()>0){ //进行接口回调 oncalllisten.responsemsg(works); return; } //查不到进行网络请求以 HttpUtils httpUtils = HttpUtils.getinstance(); api api = httpUtils.getpost(constant.BASE_URL); //获取接口中的方法 Observable<news> observable = api.getresponse(); //获取具体的参数 observable //运行到IO线程 .subscribeOn(Schedulers.io()) //回调到主线程 .observeOn(AndroidSchedulers.mainThread()) //不完成回调 .subscribe(new Consumer<news>() { @Override public void accept(news news) throws Exception { //获取具体的对象 List<news.DataBean> data = news.getData(); //创建新的集合 ArrayList<work> work1= new ArrayList<>(); //进行遍历 for (int i=0;i<data.size();i++){ //获取数据 String title = data.get(i).getTitle(); String logo = data.get(i).getLogo(); //创建对象 work work = new work(); work.setImgurl(logo); work.setTitle1(title); //添加到集合中 work1.add(work); } //接口回调 oncalllisten.responsemsg(work1); //存到数据库 workDao.insertInTx(work1); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { oncalllisten.responsemsg(null); } }); } }
//presenter实现类
package com.example.ggq.gaoguoqingzhoukao2.mvp; import com.example.ggq.gaoguoqingzhoukao2.bean.work; import java.lang.ref.WeakReference; import java.util.List; public class Presenterimp implements icontract.ipresenter<icontract.iview> { private icontract.iview iview; private moudleimp moudleimp; private WeakReference<icontract.iview> iviewWeakReference; private WeakReference<icontract.imoudel> weakReference; @Override public void attachview(icontract.iview iview) { this.iview = iview; moudleimp = new moudleimp(); //创建弱引用 iviewWeakReference = new WeakReference<>(iview); weakReference = new WeakReference<icontract.imoudel>(moudleimp); } @Override public void detachview(icontract.iview iview) { //取消关联 iviewWeakReference.clear(); weakReference.clear(); } @Override public void requestinfo() { //接口回调 moudleimp.requestdata(new icontract.imoudel.oncalllisten() { @Override public void responsemsg(List<work> works) { //v层里面的方法 iview.showdata(works); } }); } }
//fragment
package com.example.ggq.gaoguoqingzhoukao2.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.ggq.gaoguoqingzhoukao2.R; import com.example.ggq.gaoguoqingzhoukao2.adapter.myadapter; import com.example.ggq.gaoguoqingzhoukao2.bean.work; import com.example.ggq.gaoguoqingzhoukao2.mvp.Presenterimp; import com.example.ggq.gaoguoqingzhoukao2.mvp.icontract; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; /** * A simple {@link Fragment} subclass. */ public class One extends Fragment implements icontract.iview { @BindView(R.id.recycleview) RecyclerView recycleview; Unbinder unbinder; private Presenterimp Presenterimp; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_one, container, false); unbinder = ButterKnife.bind(this, view); Presenterimp = new Presenterimp(); Presenterimp.attachview(this); //请求 Presenterimp.requestinfo(); return view; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); //取消关联的方法 Presenterimp.detachview(this); } @Override public void showdata(List<work> works) { //设置布局管理器 GridLayoutManager manager = new GridLayoutManager(getActivity(), 2, GridLayoutManager.VERTICAL, false); recycleview.setLayoutManager(manager); //创建适配器 myadapter myadapter = new myadapter(getActivity(), works); //设置适配器 recycleview.setAdapter(myadapter); } }
//app
package com.example.ggq.gaoguoqingzhoukao2.app; import android.app.Application; import android.database.sqlite.SQLiteDatabase; import com.example.ggq.gaoguoqingzhoukao2.bean.DaoMaster; import com.example.ggq.gaoguoqingzhoukao2.bean.DaoSession; import com.facebook.drawee.backends.pipeline.Fresco; public class app extends Application { private static app app; private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); //上下文 app=app.this; //初始化 Fresco.initialize(this); //获取具体事务 DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "bwie"); //获取可读可写数据库 SQLiteDatabase db = helper.getWritableDatabase(); //配置默认信息 DaoMaster daoMaster = new DaoMaster(db); //做曾删改查 daoSession = daoMaster.newSession(); } public static app getinstance(){ if (app==null){ app=new app(); } return app; } //提供方法 public DaoSession getDaoSession() { return daoSession; } }
//adapter
package com.example.ggq.gaoguoqingzhoukao2.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.TextView; import com.example.ggq.gaoguoqingzhoukao2.R; import com.example.ggq.gaoguoqingzhoukao2.bean.work; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; public class myadapter extends RecyclerView.Adapter<myadapter.oneholder> { private Context context; private List<work> list; public myadapter(Context context, List<work> list) { this.context = context; this.list = list; } @NonNull @Override public oneholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.include, null); //创建对象 oneholder oneholder = new oneholder(view); return oneholder; } @Override public void onBindViewHolder(@NonNull oneholder holder, int position) { holder.bt.setText(list.get(position).getTitle1()); //获取路径 Uri uri = Uri.parse(list.get(position).getImgurl()); //设置图片 holder.my_image_view.setImageURI(uri); } @Override public int getItemCount() { return list == null ? 0 : list.size(); } //创建类 class oneholder extends RecyclerView.ViewHolder{ private TextView bt; private SimpleDraweeView my_image_view; public oneholder(View itemView) { super(itemView); //创建视图 bt = itemView.findViewById(R.id.bt); my_image_view = itemView.findViewById(R.id.my_image_view); } } }
//api
package com.example.ggq.gaoguoqingzhoukao2.api; import com.example.ggq.gaoguoqingzhoukao2.bean.news; import io.reactivex.Observable; import retrofit2.http.GET; public interface api { @GET("content_lists&version=1.7&token=&type=1&cat=&catid2=&page=1") Observable<news> getresponse(); }
//constant
package com.example.ggq.gaoguoqingzhoukao2.constant; public class constant { //定义接口地址 public static final String URL="https://app.tuozhe8.com/api.php/api/Lists/content_lists&version=1.7&token=&type=1&cat=&catid2=&page=1"; public static final String BASE_URL="https://app.tuozhe8.com/api.php/api/Lists/"; }