您的位置:首页 > 编程语言 > Java开发

MVP+Rxjava+Retryfit+分页加载+RecyclerView展示,解析以集合开头的json数据

2017-12-06 11:46 561 查看
添加依赖:

//recyclerView获取数据
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'//butterknife注解
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'// fresco
compile 'com.facebook.fresco:fresco:0.12.0'// Retrofit库
compile 'com.squareup.retrofit2:retrofit:2.0.1'
// rxjava+rxandroid+retrofit2+okhttp
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'//gson解析数据
compile 'com.google.code.gson:gson:2.6.2'


添加权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>


public interface IView {
void showList(List<MyBean.DataBean> list);
void showError(String e);
}

public class Api { //http://mnews.gw.com.cn/wap/data/news/txs/page_1.json public static final String PATH = "http://mnews.gw.com.cn/"; }
public interface ApiService {
@GET("wap/data/news/txs/page_{pages}.json")

4000
Observable<List<MyBean>> getdatas(@Path("pages")int pages) ;
}
public interface OnRequestListener { void OnSuccess(List<MyBean.DataBean> list); void OnError(String e); }
public interface IModel { void RequestData(String url,int page,OnRequestListener onRequestListener); }

public class ListModel implements IModel { @Override public void RequestData(String url,int page, final OnRequestListener onRequestListener) { //retrofit网络请求 Retrofit retrofit=new Retrofit .Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); //结合rxjava Observable<List<MyBean>> getdatas = apiService.getdatas(page); getdatas.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List<MyBean>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onRequestListener.OnError(e.getMessage().toString()); } @Override public void onNext(List<MyBean> myBeen) { List<MyBean.DataBean> data = myBeen.get(0).data; onRequestListener.OnSuccess(data); } }); } }
public interface IPresenter { void loadList(String url,int page); }

public class ListPresenter implements IPresenter { private IView iView; private IModel iModel; public ListPresenter(IView iView) { this.iView = iView; iModel = new ListModel(); } //model层与view层交互 @Override public void loadList(String url,int page) { iModel.RequestData(url,page, new OnRequestListener() { @Override public void OnSuccess(List<MyBean.DataBean> list) { iView.showList(list); } @Override public void OnError(String e) { iView.showError(e); } }); } }

public class MyBean {
public HeaderBean header;
public List<DataBean> data;

public static MyBean objectFromData(String str) {

return new Gson().fromJson(str, MyBean.class);
}

public static class HeaderBean {
public int pagesize;
public String last;
public String pre;
public String next;
public int totalsize;
public String first;
public int totalpage;

public static HeaderBean objectFromData(String str) {

return new Gson().fromJson(str, HeaderBean.class);
}
}

public static class DataBean {
public String summary;
public String img;
public String advTypeShare;
public String url;
public int countid;
public String id;
public String title;
public String otime;
public String source;
public String views;
public String resType;

public static DataBean objectFromData
193a4
(String str) {

return new Gson().fromJson(str, DataBean.class);
}
}
}


在清单列表注册 android:name=".App"
public class App extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<MyBean.DataBean> list; public MyAdapter(Context context, List<MyBean.DataBean> list) { this.context = context; this.list = list; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { holder.img.setImageURI(list.get(position).img); holder.tv.setText(list.get(position).title); } @Override public int getItemCount() { return list.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public SimpleDraweeView img; public TextView tv; public ViewHolder(View itemView) { super(itemView); img=itemView.findViewById(R.id.item_img); tv=itemView.findViewById(R.id.tv); } } }
public class MainActivity extends AppCompatActivity implements IView{ private RecyclerView recycler; private MyAdapter myAdapter; private int p=1; private SwipeRefreshLayout swif; private ListPresenter listPresenter; private LinearLayoutManager linearLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recycler = (RecyclerView) findViewById(R.id.recycler); swif = (SwipeRefreshLayout) findViewById(R.id.swif); linearLayoutManager = new LinearLayoutManager(MainActivity.this); recycler.setLayoutManager(linearLayoutManager); listPresenter = new ListPresenter(this); listPresenter.loadList(Api.PATH,p); } @Override public void showList(final List<MyBean.DataBean> list) { //设置recyclerview展示 myAdapter = new MyAdapter(MainActivity.this, list); recycler.setAdapter(myAdapter); recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition == list.size() - 1) { p++; listPresenter.loadList(Api.PATH,p); } } }); swif.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { p++; listPresenter.loadList(Api.PATH,p); swif.setRefreshing(false); } }); } @Override public void showError(String e) { Toast.makeText(this, "" + e, Toast.LENGTH_SHORT).show(); Log.e("哈哈哈哈啊哈哈哈哈", e); } }
//主页面布局 <android.support.v4.widget.SwipeRefreshLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/swif"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler"></android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout>
//Adapter布局 <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/item_img" android:layout_width="150dp" android:layout_height="150dp" android:layout_margin="8dp" fresco:failureImage="@mipmap/ic_launcher" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/tv" android:text="dfdf" android:gravity="center"/>

public interface IView {
void showList(List<MyBean.DataBean> list);
void showError(String e);
}


public class Api {
//http://mnews.gw.com.cn/wap/data/news/txs/page_1.json

public static final String PATH = "http://mnews.gw.com.cn/";
}


public interface ApiService {
@GET("wap/data/news/txs/page_{pages}.json")
Observable<List<MyBean>> getdatas(@Path("pages")int pages) ;
}


public interface OnRequestListener {
void OnSuccess(List<MyBean.DataBean> list);
void OnError(String e);
}


public interface IModel {
void RequestData(String url,int page,OnRequestListener onRequestListener);
}


public class ListModel implements IModel {
@Override
public void RequestData(String url,int page, final OnRequestListener onRequestListener) {
//retrofit网络请求
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
//结合rxjava
Observable<List<MyBean>> getdatas = apiService.getdatas(page);
getdatas.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<MyBean>>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
onRequestListener.OnError(e.getMessage().toString());
}

@Override
public void onNext(List<MyBean> myBeen) {
List<MyBean.DataBean> data = myBeen.get(0).data;
onRequestListener.OnSuccess(data);
}
});

}
}


public interface IPresenter {
void loadList(String url,int page);
}


public class ListPresenter implements IPresenter {
private IView iView;
private IModel iModel;

public ListPresenter(IView iView) {
this.iView = iView;
iModel = new ListModel();
}
//model层与view层交互
@Override
public void loadList(String url,int page) {
iModel.RequestData(url,page, new OnRequestListener() {
@Override
public void OnSuccess(List<MyBean.DataBean> list) {
iView.showList(list);
}

@Override
public void OnError(String e) {
iView.showError(e);
}
});
}
}


public class MyBean {
public HeaderBean header;
public List<DataBean> data;

public static MyBean objectFromData(String str) {

return new Gson().fromJson(str, MyBean.class);
}

public static class HeaderBean {
public int pagesize;
public String last;
public String pre;
public String next;
public int totalsize;
public String first;
public int totalpage;

public static HeaderBean objectFromData(String str) {

return new Gson().fromJson(str, HeaderBean.class);
}
}

public static class DataBean {
public String summary;
public String img;
public String advTypeShare;
public String url;
public int countid;
public String id;
public String title;
public String otime;
public String source;
public String views;
public String resType;

public static DataBean objectFromData(String str) {

return new Gson().fromJson(str, DataBean.class);
}
}
}


在清单列表注册
android:name=".App"


public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private Context context;
private List<MyBean.DataBean> list;

public MyAdapter(Context context, List<MyBean.DataBean> list) {
this.context = context;
this.list = list;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
holder.img.setImageURI(list.get(position).img);
holder.tv.setText(list.get(position).title);
}

@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public SimpleDraweeView img;
public TextView tv;
public ViewHolder(View itemView) {
super(itemView);
img=itemView.findViewById(R.id.item_img);
tv=itemView.findViewById(R.id.tv);
}
}
}


public class MainActivity extends AppCompatActivity implements IView{

private RecyclerView recycler;
private MyAdapter myAdapter;
private int p=1;
private SwipeRefreshLayout swif;
private ListPresenter listPresenter;
private LinearLayoutManager linearLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycler = (RecyclerView) findViewById(R.id.recycler);
swif = (SwipeRefreshLayout) findViewById(R.id.swif);
linearLayoutManager = new LinearLayoutManager(MainActivity.this);
recycler.setLayoutManager(linearLayoutManager);
listPresenter = new ListPresenter(this);
listPresenter.loadList(Api.PATH,p);

}

@Override
public void showList(final List<MyBean.DataBean> list) {
//设置recyclerview展示
myAdapter = new MyAdapter(MainActivity.this, list);
recycler.setAdapter(myAdapter);
recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
if (lastVisibleItemPosition == list.size() - 1) {
p++;
listPresenter.loadList(Api.PATH,p);
}
}
});
swif.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
p++;
listPresenter.loadList(Api.PATH,p);

swif.setRefreshing(false);

}
});
}

@Override
public void showError(String e) {
Toast.makeText(this, "" + e, Toast.LENGTH_SHORT).show();
Log.e("哈哈哈哈啊哈哈哈哈", e);
}
}


//主页面布局
<android.support.v4.widget.SwipeRefreshLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:id="@+id/swif">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler"></android.support.v7.widget.RecyclerView>

</android.support.v4.widget.SwipeRefreshLayout>


//Adapter布局
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/item_img"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_margin="8dp"
fresco:failureImage="@mipmap/ic_launcher" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv"
android:text="dfdf"
android:gravity="center"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐