在app的build.gradle依赖
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'
implementation('com.jcodecraeer:xrecyclerview:1.5.9') {
exclude group: 'com.android.support'
}
implementation 'com.github.bumptech.glide:glide:3.8.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
访问http://www.zhaoapi.cn/product/searchProducts?keywords=手机&sort=1
Bean类
Goods类
@Entity
public class Goods {
private double bargainPrice;
private String createtime;
private String detailUrl;
private String images;
private int num;
private int pid;
private double price;
private int pscid;
private int selected;
@Id(autoincrement = true)
private long sellerid;
private String subhead;
private String title;
private int count=1;
Result类
public class Result<T> {
private String code;
private String msg;
private T data;
core包里写
BaseCore
public interface BaseCore<T> {
void loadSuccess(T data);
void loadError(Result result);
}
DataCall
public interface DataCall {
@POST("product/searchProducts")
@FormUrlEncoded
Observable<Result<List<Goods>>> loginRx(@Field("keywords")String keywords,
@Field("sort")String sort);
}
app包里写
Myapp,清单文件上配置
package com.baidu.lianxi4.app;
import android.app.Application;
import android.os.Environment;
import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import java.io.File;
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this,getConfig());
}
private ImagePipelineConfig getConfig() {
File file = new File(Environment.getExternalStorageDirectory()+File.separator+"image");
if (!file.exists()){
file.mkdir();
}
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setMainDiskCacheConfig(DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(file)
.build()).build();
return config;
}
}
http包里写
NetWorkManager
package com.baidu.lianxi4.http;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by Zaifeng on 2018/2/28.
* API初始化类
*/
public class NetWorkManager {
private static NetWorkManager mInstance;
private Retrofit retrofit;
private static final String BASE_URL="http://www.zhaoapi.cn/";
private NetWorkManager(){
init();
}
public static NetWorkManager getInstance(){
if (mInstance==null){
mInstance = new NetWorkManager();
}
return mInstance;
}
/**
* 初始化必要对象和参数
*/
public void init() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();
// 初始化Retrofit
retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
//把接口的注解翻译为OKhttp请求
public <T> T create(final Class<T> service) {
return retrofit.create(service);
}
public boolean isNet(Context context){
ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if (info!=null&&info.isConnected()){
return true;
}else {
return false;
}
}
}
把Greendao的依赖补全
app级别
implementation 'org.greenrobot:greendao:3.2.2'
implementation 'org.greenrobot:greendao-generator:3.2.2'
implementation 'com.android.support:recyclerview-v7:28.0.0'
/*加载图片的框架Fresco*/
implementation 'com.facebook.fresco:fresco:1.11.0'
最上面
apply plugin: 'org.greenrobot.greendao'
模块
greendao {
schemaVersion 1 //版本
daoPackage 'com.baidu.lianxi4.greendao' // 一般为app包名+生成文件的文件夹名
targetGenDir 'src/main/java' //生成文件路径
}
程序级别
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
保证bean类正确
自动greendao
persenter包里写GoodsPresnter
package com.baidu.lianxi4.persenter;
import android.widget.Toast;
import com.baidu.lianxi4.DataCall;
import com.baidu.lianxi4.bean.Goods;
import com.baidu.lianxi4.bean.Result;
import com.baidu.lianxi4.core.BaseCore;
import com.baidu.lianxi4.http.NetWorkManager;
import com.google.gson.Gson;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
public class GoodsPresenter {
private BaseCore baseCore;
public GoodsPresenter(BaseCore baseCore) {
this.baseCore=baseCore;
}
public void unBaseCore(){
baseCore = null;
}
public void readData(Object... objects){
String keywords= (String) objects[0];
DataCall iLogin = NetWorkManager.getInstance().create(DataCall.class);
iLogin.loginRx("手机","1")
.subscribeOn(Schedulers.newThread())//将请求调度到子线程上
.observeOn(AndroidSchedulers.mainThread())//观察响应结果,把响应结果调度到主线程中处理
.subscribe(new Consumer<Result<List<Goods>>>() {//把响应结果订阅到消费者中进行处理
@Override
public void accept(Result<List<Goods>> result) throws Exception {
if (result.getCode().equals("0")){
baseCore.loadSuccess(result.getData());
}else {
baseCore.loadError(result);
}
}
});
}
}
布局
<?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">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"></android.support.v7.widget.RecyclerView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_height="wrap_content">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image_view"
android:layout_width="100dp"
android:layout_height="100dp"
android:adjustViewBounds="true"/>
<TextView
android:id="@+id/text_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:text="标题"/>
<TextView
android:id="@+id/text_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#f00"
android:textSize="20sp"
android:text="价格"/>
</LinearLayout>
MainActicity
package com.baidu.lianxi4;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.lianxi4.adapter.MyAdapter;
import com.baidu.lianxi4.bean.Goods;
import com.baidu.lianxi4.bean.Result;
import com.baidu.lianxi4.core.BaseCore;
import com.baidu.lianxi4.greendao.DaoMaster;
import com.baidu.lianxi4.greendao.DaoSession;
import com.baidu.lianxi4.greendao.GoodsDao;
import com.baidu.lianxi4.http.NetWorkManager;
import com.baidu.lianxi4.persenter.GoodsPresenter;
import com.google.gson.Gson;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity implements BaseCore {
@BindView(R.id.recycler)
RecyclerView recycler;
private GoodsPresenter presenter;
private GoodsDao goodsBeanDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
// recycler.setLayoutManager(staggeredGridLayoutManager);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(OrientationHelper.VERTICAL);
recycler.setLayoutManager(layoutManager);
presenter = new GoodsPresenter(this);
DaoSession daoSession = DaoMaster.newDevSession(this, GoodsDao.TABLENAME);
goodsBeanDao = daoSession.getGoodsDao();
boolean net = NetWorkManager.getInstance().isNet(this);
if (net) {
presenter.readData("笔记本");
} else {
List<Goods> list = goodsBeanDao.loadAll();
MyAdapter adapter = new MyAdapter();
adapter.setContext(this);
adapter.setList(list);
recycler.setAdapter(adapter);
}
}
@Override
public void loadSuccess(Object data) {
List<Goods> list = (List<Goods>) data;
goodsBeanDao.insertOrReplaceInTx(list);
MyAdapter adapter = new MyAdapter();
adapter.setContext(this);
adapter.setList(list);
recycler.setAdapter(adapter);
}
@Override
public void loadError(Result result) {
Toast.makeText(this, result.getMsg(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.unBaseCore();
}
}
适配器
package com.baidu.lianxi4.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.baidu.lianxi4.R;
import com.baidu.lianxi4.bean.Goods;
import com.facebook.drawee.view.SimpleDraweeView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> {
private Context context;
private List<Goods> list;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public List<Goods> getList() {
return list;
}
public void setList(List<Goods> list) {
this.list = list;
}
@NonNull
@Override
public VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LinearLayout.inflate(viewGroup.getContext(), R.layout.itme_layout, null);
return new VH(v);
}
@Override
public void onBindViewHolder(@NonNull VH vh, int i) {
vh.title.setText(list.get(i).getTitle());
vh.price.setText("¥"+list.get(i).getPrice());
String replace = list.get(i).getImages();//.replace("https", "http");
String[] split = replace.split("!");
vh.imageView.setImageURI(split[0]);
}
@Override
public int getItemCount() {
return list.size();
}
public class VH extends RecyclerView.ViewHolder{
private final SimpleDraweeView imageView;
private final TextView title;
private final TextView price;
public VH(@NonNull View itemView) {
super(itemView);
imageView= itemView.findViewById(R.id.image_view);
title= itemView.findViewById(R.id.text_title);
price= itemView.findViewById(R.id.text_price);
}
}
}