简单的一个MVP模式实现OKhttp请求网络数据,xrecyclerview上拉刷新,下拉加载。
首先是View层,定义一个接口类,实现显示数据的方法。
IDataView(接口类):
其中有两个方法,一个是显示数据的,另一个是刷新数据的
public interface IDataView { public void showDataView(); public void reFresh(List<RecyclerBean.SongListBean> listdata); }然后是Model层,用来获得数据的。
IDataModel(接口类):
里面实现的是加载数据的方法
public interface IDataModel { public void loadData(int type, Callback callback); }DataModel类:
实现IDataModel类,重写里面的方法加载数据
public class DataModel implements IDataModel{ @Override public void loadData(int type, Callback callback) { OkHttpUtils.getInstance().doGet("http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type="+type+"&size=10&offset=0",callback); } }presenter层是连接model层和view层的
DataPresenter类
showdatamodel方法调用了model的加载数据的方法再将数据转化为json格式当flag为true时加载更多将数据给list集合,flag为false时下拉刷新,清空集合的旧数据,再把新数据给集合。然后在调用view的刷新方法,把数据放入此方法中。
public class DataPresenter{ DataModel model; IDataView view; List<RecyclerBean.SongListBean> listdata=new ArrayList<>(); public DataPresenter(IDataView view) { this.view = view; this.model=new DataModel(); } public void showdatamodel(int type, final boolean flag){ model.loadData(type, new OnUiCallback() { @Override public void onFailed(Call call, IOException e) { } @Override public void onSuccess(String result) { Gson gson=new Gson(); RecyclerBean recyclerBean = gson.fromJson(result, RecyclerBean.class); if (flag){ listdata.addAll(recyclerBean.getSong_list()); }else{ listdata.clear(); listdata.addAll(recyclerBean.getSong_list()); } view.reFresh(listdata); } }); } }Activity中:
首先找控件,实例化presenter,再showdataview中加载布局管理器,实力化适配器,加载监听中处理数据。重写刷新的方法,然后再将type值和flag的状态传回presenter传回model。
public class MainActivity extends AppCompatActivity implements IDataView{ List<RecyclerBean.SongListBean> listdata; DataPresenter presenter; XRecyclerView xrv; ShopRecyclerAdapter adapter; int type=21; boolean flag=true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); presenter=new DataPresenter(this); showDataView(); presenter.showdatamodel(type,flag); } private void initview() { xrv= (XRecyclerView) findViewById(R.id.xrv); } @Override public void showDataView() { LinearLayoutManager manager = new LinearLayoutManager(this); xrv.setLayoutManager(manager); adapter = new ShopRecyclerAdapter(this); xrv.setAdapter(adapter); xrv.setLoadingMoreEnabled(true); xrv.setPullRefreshEnabled(true); xrv.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { if(type<25){ type++; }else{ type=20; type++; } flag=false; presenter.showdatamodel(type,flag); xrv.refreshComplete(); } @Override public void onLoadMore() { type--; flag=true; presenter.showdatamodel(type,flag); xrv.loadMoreComplete(); } }); } @Override public void reFresh(List<RecyclerBean.SongListBean> listdata) { adapter.notifyDataSetChanged(); } }Adapter中:
public class ShopRecyclerAdapter extends XRecyclerView.Adapter<XRecyclerView.ViewHolder> { Context context; List<RecyclerBean.SongListBean> listBean; public ShopRecyclerAdapter(Context context) { this.context = context; } public void setRefresh(List<RecyclerBean.SongListBean> listBean){ this.listBean=listBean; notifyDataSetChanged(); } @Override public XRecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context, R.layout.recy_item,null); return new LeftViewHolder(view); } @Override public void onBindViewHolder(XRecyclerView.ViewHolder holder, int position) { ((LeftViewHolder)holder).tv_name.setText(listBean.get(position).getArtist_name()); ((LeftViewHolder)holder).tv_title.setText(listBean.get(position).getAlbum_title()); Glide.with(context).load(listBean.get(position).getPic_big()).override(120,120).into(((LeftViewHolder)holder).iv_icon); } @Override public int getItemCount() { return listBean!=null?listBean.size():0; } public static class LeftViewHolder extends XRecyclerView.ViewHolder{ TextView tv_name,tv_title; ImageView iv_icon; public LeftViewHolder(View itemView) { super(itemView); tv_name=itemView.findViewById(R.id.tv_name); tv_title=itemView.findViewById(R.id.tv_title); iv_icon=itemView.findViewById(R.id.iv_icon); } } }