写权限
开始Fresco的依赖 implementation 'com.facebook.fresco:fresco:0.12.0'
首先GeenDao的依赖
implementation 'org.greenrobot:greendao:3.2.2'
1:在项目的build.grade文件里加入一行代码 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
2:在app的build.grade里面加上代码 apply plugin: 'org.greenrobot.greendao'
3:在app的build.grad里面Android{}里加上代码
* greendao{
* schemaVersion 1 //指定数据库schema版本号,迁移等操作会用到
* //包名是活的这是变动的
* daoPackage 'soexample.umeng.com.greendaodemo.mydao(最后一个参数你可以创建一个包然后把小锤子敲出来的东西放进去)' //dao的包名,包名默认是entity所在的包;
* targetGenDir 'src/main/java'//生成数据库文件的目录
* }
然后创建一个bean(里边的数据是你解析接口出来用的东西{属性写上就可以用小锤子了})例如:
package com.example.lenovo.myapplicationn.bean;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;
@Entity
public class GreenDaoNewsBean {
@Id(autoincrement = true)
private Long id;
private String thumbnail_pic_s;
private String title;
@Generated(hash = 1544509992)
public GreenDaoNewsBean(Long id, String thumbnail_pic_s, String title) {
this.id = id;
this.thumbnail_pic_s = thumbnail_pic_s;
this.title = title;
}
public GreenDaoNewsBean( String thumbnail_pic_s, String title) {
this.thumbnail_pic_s = thumbnail_pic_s;
this.title = title;
}
@Generated(hash = 1269668459)
public GreenDaoNewsBean() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getThumbnail_pic_s() {
return this.thumbnail_pic_s;
}
public void setThumbnail_pic_s(String thumbnail_pic_s) {
this.thumbnail_pic_s = thumbnail_pic_s;
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "GreenDaoNewsBean{" +
"id=" + id +
", thumbnail_pic_s='" + thumbnail_pic_s + '\'' +
", title='" + title + '\'' +
'}';
}
}
然后必须写Application (Fresco进行初始化Fresco.initialize(this)这就能用了)
package com.example.lenovo.myapplicationn.app;
import android.app.Application;
import android.database.sqlite.SQLiteDatabase;
import com.example.lenovo.myapplicationn.mydao.DaoMaster;
import com.example.lenovo.myapplicationn.mydao.DaoSession;
import com.facebook.drawee.backends.pipeline.Fresco;
public class GreenDdaoApp extends Application {
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "ahaha");
SQLiteDatabase writableDatabase = helper.getWritableDatabase();
DaoMaster master = new DaoMaster(writableDatabase);
daoSession = master.newSession();
}
public static DaoSession getDaoSession(){
return daoSession;
}
}
接下来写Retrofi和RxJava的依赖
这个是在项目的build.grade里面直接粘过去就OK
ext {
// Sdk and tools
minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'
//support版本
supportVersion = '27.1.0'
constraintLayout = '1.0.2'
junit = '4.12'
testRunner = '1.0.1'
espressoCore = '3.0.1'
interceptor = "3.11.0"
retrofit = '2.3.0'
converterGson = '2.3.0'
rxandroid = '1.2.1'
rxjava = '1.3.0'
rxbus = '1.0.6'
adapterRxjava = '2.0.2'
}
implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.interceptor"
implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofit"
implementation "com.squareup.retrofit2:converter-gson:$rootProject.converterGson"
implementation "io.reactivex:rxandroid:$rootProject.rxandroid"
implementation "io.reactivex:rxjava:$rootProject.rxjava"
implementation "com.hwangjr.rxbus:rxbus:$rootProject.rxbus"
implementation "com.squareup.retrofit2:adapter-rxjava:$rootProject.adapterRxjava"
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
先看两个布局(一个主布局,一个适配器的子布局)
<?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">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/list_x"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>
<?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="match_parent">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/img_sim"
android:layout_width="100dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
接下来看一下简单的MVP解析数据传入Activity
储存接口的类MyContacts
package com.example.lenovo.myapplicationn.contacts;
public class MyContacts {
public static final String BASE_URL="http://www.xieast.com/api/news/";
public static final String MORE_DATA="news.php?page=";
}
处理接口的类 MyService(用的是get还是post)
package com.example.lenovo.myapplicationn.service;
import com.example.lenovo.myapplicationn.bean.News;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Url;
import rx.Observable;
public interface MyService {
@GET
Call<News> get(@Url String url);
}
然后把M层和P层和V层的声明接口的类写在一块了
package com.example.lenovo.myapplicationn.contract;
import com.example.lenovo.myapplicationn.bean.News;
import rx.Observer;
public interface Contract {
interface Model {
//接口方法名随便起,参数必须是观察者模式Observer是泛型,中间的泛型是你的bean的类名
void setRequest(Observer<News> data);
}
interface View<T> {
void success(T data);
void error(T error);
}
interface Presenter {
void startRequest(String url);
}
}
接下来看实现M层
package com.example.lenovo.myapplicationn.model;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.contacts.MyContacts;
import com.example.lenovo.myapplicationn.contract.Contract;
import com.example.lenovo.myapplicationn.service.MyService;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class Model implements Contract.Model {
@Override
public void setRequest(Observer<News> data) {
//观察者Observable要监督被观察者并订阅
Observable.create(new Observable.OnSubscribe<News>() {
@Override
public void call(final Subscriber<? super News> subscriber) {
//Retrofit的请求数据
Retrofit retrofit=new Retrofit.Builder()
//添加拦截器
//设置网络请求的url
.baseUrl(MyContacts.BASE_URL)
//设置Gson
.addConverterFactory(GsonConverterFactory.create())
//设置Rxjava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
MyService myService = retrofit.create(MyService.class);
Call<News> newsCall = myService.get(MyContacts.MORE_DATA);
newsCall.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
News body = response.body();
subscriber.onNext(body);
subscriber.onCompleted();
}
@Override
public void onFailure(Call<News> call, Throwable t) {
}
});
}
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.subscribe(data);
}
}
再来实现P层
package com.example.lenovo.myapplicationn.presenter;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.contract.Contract;
import com.example.lenovo.myapplicationn.model.Model;
import rx.Observer;
public class Presenter implements Contract.Presenter {
private Contract.Model model;
private Contract.View view;
public Presenter(Contract.View view) {
this.view = view;
model = new Model();
}
@Override
public void startRequest(String url) {
model.setRequest(new Observer<News>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(News news) {
view.success(news);
}
});
}
}
然后MVP到就这了,接下来两个适配器(一个是第一次解析数据的适配器并把数据传入Greendao,一个是当Greendao里有数据时可以断网使用了)
package com.example.lenovo.myapplicationn.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 android.widget.Toast;
import com.example.lenovo.myapplicationn.MainActivity;
import com.example.lenovo.myapplicationn.R;
import com.example.lenovo.myapplicationn.app.GreenDdaoApp;
import com.example.lenovo.myapplicationn.bean.GreenDaoNewsBean;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.mydao.GreenDaoNewsBeanDao;
import com.facebook.drawee.view.SimpleDraweeView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
public class MyAdapter extends XRecyclerView.Adapter<MyAdapter.ViewHolder> {
private Context mContext;
private List<News.DataBean> mList;
GreenDaoNewsBeanDao greenDaoNewsBeanDao = GreenDdaoApp.getDaoSession().getGreenDaoNewsBeanDao();
private long insert;
public MyAdapter(Context mContext, List<News.DataBean> mList) {
this.mContext = mContext;
this.mList = mList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.img.setImageURI(Uri.parse(mList.get(i).getThumbnail_pic_s()));
viewHolder.title.setText(mList.get(i).getTitle());
for (int j = 0; j < mList.size(); j++) {
insert = greenDaoNewsBeanDao.insert(new GreenDaoNewsBean(mList.get(j).getThumbnail_pic_s(), mList.get(j).getTitle()));
}
}
@Override
public int getItemCount() {
return mList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private SimpleDraweeView img;
private TextView title;
public ViewHolder(@NonNull View itemView) {
super(itemView);
img = itemView.findViewById(R.id.img_sim);
title = itemView.findViewById(R.id.title_tv);
}
}
}
package com.example.lenovo.myapplicationn.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 android.widget.Toast;
import com.example.lenovo.myapplicationn.R;
import com.example.lenovo.myapplicationn.app.GreenDdaoApp;
import com.example.lenovo.myapplicationn.bean.GreenDaoNewsBean;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.mydao.GreenDaoNewsBeanDao;
import com.facebook.drawee.view.SimpleDraweeView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
public class MyGreenDaoAdapter extends XRecyclerView.Adapter<MyGreenDaoAdapter.ViewHolder> {
private Context mContext;
private List<GreenDaoNewsBean> mList;
public MyGreenDaoAdapter(Context mContext, List<GreenDaoNewsBean> mList) {
this.mContext = mContext;
this.mList = mList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.img.setImageURI(Uri.parse(mList.get(i).getThumbnail_pic_s()));
viewHolder.title.setText(mList.get(i).getTitle());
}
@Override
public int getItemCount() {
return mList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private SimpleDraweeView img;
private TextView title;
public ViewHolder(@NonNull View itemView) {
super(itemView);
img = itemView.findViewById(R.id.img_sim);
title = itemView.findViewById(R.id.title_tv);
}
}
}
最后一个主页面
package com.example.lenovo.myapplicationn;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Toast;
import com.example.lenovo.myapplicationn.adapter.MyAdapter;
import com.example.lenovo.myapplicationn.adapter.MyGreenDaoAdapter;
import com.example.lenovo.myapplicationn.app.GreenDdaoApp;
import com.example.lenovo.myapplicationn.bean.GreenDaoNewsBean;
import com.example.lenovo.myapplicationn.bean.News;
import com.example.lenovo.myapplicationn.contacts.MyContacts;
import com.example.lenovo.myapplicationn.contract.Contract;
import com.example.lenovo.myapplicationn.mydao.GreenDaoNewsBeanDao;
import com.example.lenovo.myapplicationn.presenter.Presenter;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements Contract.View {
private XRecyclerView list_x;
private List<News.DataBean> list=new ArrayList<>();
private MyAdapter adapter;
private MyGreenDaoAdapter greenDaoAdapter;
private Presenter presenter;
private int index=1;
private GreenDaoNewsBeanDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
boolean empty = dao.loadAll().isEmpty();
if (empty){
presenter.startRequest(MyContacts.MORE_DATA+index);
adapter = new MyAdapter(this, list);
list_x.setAdapter(adapter);
}else{
List<GreenDaoNewsBean> list1 = dao.loadAll();
greenDaoAdapter = new MyGreenDaoAdapter(this, list1);
list_x.setAdapter(greenDaoAdapter);
}
list_x.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
list.clear();
index=1;
presenter.startRequest(MyContacts.MORE_DATA+index);
list_x.refreshComplete();
}
@Override
public void onLoadMore() {
index++;
presenter.startRequest(MyContacts.MORE_DATA+index);
list_x.loadMoreComplete();
}
});
}
private void initView() {
list_x = (XRecyclerView) findViewById(R.id.list_x);
dao = GreenDdaoApp.getDaoSession().getGreenDaoNewsBeanDao();
list_x.setLayoutManager(new LinearLayoutManager(this));
list_x.setPullRefreshEnabled(true);
list_x.setLoadingMoreEnabled(true);
presenter = new Presenter(this);
}
@Override
public void success(Object data) {
News news= (News) data;
list.addAll(news.getData());
adapter.notifyDataSetChanged();
}
@Override
public void error(Object error) {
}
}