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

来源:互联网 发布:从网络怎么找到打印机 编辑:程序博客网 时间:2024/06/05 23:53

添加依赖:

//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'// frescocompile 'com.facebook.fresco:fresco:0.12.0'// Retrofitcompile 'com.squareup.retrofit2:retrofit:2.0.1'// rxjava+rxandroid+retrofit2+okhttpcompile '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")    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"/>


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"/>
阅读全文
0 0
原创粉丝点击