MVP模式下的RecyclerView案例
来源:互联网 发布:优化算法比较好的书籍 编辑:程序博客网 时间:2024/05/19 14:16
一,镶嵌在SprigView中,要导入SprigView和RecyclerView的依赖(百度)
二,布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.liaoinstan.springview.widget.SpringView android:id="@+id/springview" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="wrap_content" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </com.liaoinstan.springview.widget.SpringView></LinearLayout>三,创建适配器
//继承RecyclerView.Adapterpublic class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //上下文和数据 Context context; List<MyBean.ResultBean.DataBean> list; //构造方法 public RecyclerViewAdapter(Context context) { this.context = context; } //添加数据 public void addbean(List<MyBean.ResultBean.DataBean> list) { list.addAll(list); //更新数据 notifyDataSetChanged(); } //重写三个方法 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //根据类型viewType创建ViewHolder,多条目有几个创建几个 if (viewType == 0) { View view1 = LayoutInflater.from(context).inflate(R.layout.itemre, parent, false); //返回对应的布局 return new ViewHolder(view1); } else if (viewType == 1) { View view2 = LayoutInflater.from(context).inflate(R.layout.itemre2, parent, false); return new ViewHolder2(view2); } else { View view3 = LayoutInflater.from(context).inflate(R.layout.itemre3, parent, false); return new ViewHolder3(view3); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //根据ViewHolder判断多条目显示 if (holder instanceof ViewHolder) { //直接拿到 ViewHolder viewHolder = (ViewHolder) holder; //做显示 viewHolder.itemTextview.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder.itemImageView); } else if (holder instanceof ViewHolder2) { ViewHolder2 viewHolder2 = (ViewHolder2) holder; viewHolder2.item2Textview.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder2.item2ImageView1); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),viewHolder2.item2ImageView2); } else { ViewHolder3 viewHolder3 = (ViewHolder3) holder; viewHolder3.item3Textview.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder3.item3ImageView1); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),viewHolder3.item3ImageView2); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s03(),viewHolder3.item3ImageView3); } } @Override public int getItemCount() { return list.size(); } //还需要重写方法 // 对应布局类型 @Override public int getItemViewType(int position) { if (!TextUtils.isEmpty(list.get(position).getThumbnail_pic_s03())){ return 2; }else if (!TextUtils.isEmpty(list.get(position).getThumbnail_pic_s02())){ return 1; }else{ return 0; } } //使用buttonknife自动创建viewHolder,继承RecyclerViewHolder static class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.item_image_view) ImageView itemImageView; @BindView(R.id.item_textview) TextView itemTextview; ViewHolder(View view) { //给一个super super(view); ButterKnife.bind(this, view); } } static class ViewHolder2 extends RecyclerView.ViewHolder { @BindView(R.id.item2_image_view1) ImageView item2ImageView1; @BindView(R.id.item2_image_view2) ImageView item2ImageView2; @BindView(R.id.item2_textview) TextView item2Textview; ViewHolder2(View view) { super(view); ButterKnife.bind(this, view); } } static class ViewHolder3 extends RecyclerView.ViewHolder { @BindView(R.id.item3_image_view1) ImageView item3ImageView1; @BindView(R.id.item3_image_view2) ImageView item3ImageView2; @BindView(R.id.item3_image_view3) ImageView item3ImageView3; @BindView(R.id.item3_textview) TextView item3Textview; ViewHolder3(View view) { super(view); ButterKnife.bind(this, view); } }}四,适配器中用到的子布局很简单,在此不做介绍了
五,拿到接口,封装数据bean
六,获取数据
1,创建P层
public class MainActivityPresenter { //实例model MainActivityModel mainActivityModel; //实例view MainActivityView mainActivityView; //构造方法 public MainActivityPresenter(MainActivityView mainActivityView){ //view接口传过来他就持有MainActivityView,然后定义出来,构造 this.mainActivityView = mainActivityView; this.mainActivityModel = new MainActivityModel(); } //获取数据的方法,上拉刷新和下拉加载 public void onfresh(boolean up){ mainActivityModel.onfresh(up, new MainActivityModel.ModelCallBack() { @Override public void success(MyBean myBean) { //通过view的接口往回调 mainActivityView.success(myBean); } @Override public void failure(Exception e) { mainActivityView.fasle(e); } }); } //上拉加载需要一个page参数 /*public void onloadmore(int page){ }*/2,创建model层
public class MainActivityModel { //提供对应的上拉下拉方法 //up为true就是下拉刷新,为false就是上拉加载 public void onfresh(boolean up, final ModelCallBack modelCallBack){ //拿封装好的网络请求数据,第一个参数map类型,不需要,第二个,请求路劲,第三个回调,泛型是你的bean指定类型 OkhttpUtils.getInstance().asy(null, "http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653", new AbstractUiCallBack<MyBean>() { @Override public void success(MyBean myBean) { //成功就调到数据了,然后要回调到presenter里 modelCallBack.success(myBean); } @Override public void failure(Exception e) { modelCallBack.failure(e); } }); } //创建回调接口 public interface ModelCallBack{ public void success(MyBean myBean); public void failure(Exception e); } //需要判断是上拉还是下拉,就需要写两个方法,给个boon值用来判断,up为true是 /*public void onloadmore(int page){ }*/}
3,view层
public interface MainActivityView { //数据成功回调的方法,需要数据参数 public void success(MyBean myBean); //失败,封装的接口(okhttp)里回调一个Exception public void fasle(Exception e);}七,Activity
//实现View接口public class MainActivity extends Activity implements MainActivityView { //初始化控件 RecyclerView recyclerview; SpringView springview; private MainActivityPresenter mainActivityPresenter; private RecyclerViewAdapter recyclerViewAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 recyclerview = findViewById(R.id.recyclerview); springview = findViewById(R.id.springview); //获取数据,使用mvp模式,创建p层,实例化,presenter回调需要把当前的view接口传过去 mainActivityPresenter = new MainActivityPresenter(this); //MainActivityPresenter回调view,需要定义一个view的接口 //实例化适配器 recyclerViewAdapter = new RecyclerViewAdapter(this); //布局管理器,一参上下文,二参方向 LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); //给RecyclerView设置管理器 recyclerview.setLayoutManager(layoutManager); //设置适配器 recyclerview.setAdapter(recyclerViewAdapter); //springview添加头尾部 springview.setHeader(new DefaultHeader(this)); springview.setFooter(new DefaultFooter(this)); //特别要注意springview的监听 springview.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { //实例化presenter调用precenter里的方法,precenter掉model mainActivityPresenter.onfresh(true); } @Override public void onLoadmore() { mainActivityPresenter.onfresh(false); } }); //给一个默认显示 mainActivityPresenter.onfresh(true); } @Override public void success(MyBean myBean) { //最后要显示数据,更新数据源 if(springview != null){ springview.onFinishFreshAndLoad(); } recyclerViewAdapter.addbean(myBean.getResult().getData()); } @Override public void fasle(Exception e) { Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show(); }}
八,请求数据用到的封装好的OKHTTP
九,多条目布局用Imageloader(设置权限和配置)
//配置Imageloaderpublic class MyApps extends Application{ @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration .Builder(this) .build(); ImageLoader.getInstance().init(imageLoaderConfiguration); //然后要到清单文件中配置name和网络权限 }}
阅读全文
0 0
- MVP模式下的RecyclerView案例
- MVP模式的RecyclerView案例
- RecyclerView的MVP模式简单使用
- 超简单的MVP模式案例
- MVP模式下的生命周期
- android中MVP模式的小案例(一)
- MVP模式下的二级购物车
- RecyclerView在mvp模式中的刷新
- MVP模式OKhttp请求RecyclerView展示数据
- MvP+recyclerview
- Mvp+RecyclerView
- MVP+RecyclerView
- android 用mvp模式来架构自己的app+打造Recyclerview万能适配器
- 设计模式MVP案例----省市查询
- Android_Retrofit+RxJava+MVP开发模式案例
- RecyclerView的案例和解析
- [转] iOS --- 基于面向协议MVP模式下的软件设计
- 基于MVP模式下的无限轮播ViewPager
- 6.16买鸡问题
- linux shell之mount
- TCP Keepalive && Heartbeat
- 3.你重写过hashcode和equals么,要注意什么
- IO流总结
- MVP模式下的RecyclerView案例
- etcd 单节点配置
- 欢迎使用CSDN-markdown编辑器
- 分布式计算的几种硬件场景及其对应的解决方案
- Android情景分析之属性服务(新)
- c++内存分配方式,栈,堆,静态存储区
- 配置ubuntu17.10启动到命令行
- 20171111
- 第二周 神经网络基础