Android MVP设计框架模板 之 漂亮ListView上拉刷新下拉加载更多

来源:互联网 发布:演唱会市场怎样 知乎 编辑:程序博客网 时间:2024/04/29 03:10



Android MVP设计框架模板 之 漂亮ListView上拉刷新下拉加载更多


(本人自行攒写,难免有错误,请谅解)mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

项目中大部分是面对接口编程,通过P层可以预先将所有需要的接口功能写出来,进而进行实现,大大提高了项目高内聚,低耦合。适合于团队开发项目。

今天我们是用MVP的设计框架模板来实现一个ListView的上拉刷新下拉加载更多的功能。

项目结构如下图;


1、首先我们ListViewPresenters.java类,他的作用是,控制M业务逻辑层,去获取我们想要的数据,然后通知V层去更新他们对应的UI。由于我们的需求明确,就是实现Listview的上拉刷新,下拉加载更多,初始化控件,设置上拉下拉刷新监听。因此我们可以先把功能接口都写好,让ListViewPresenters去实现其功能即可。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.presenters;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.support.v4.app.FragmentActivity;  
  6. import android.view.View;  
  7.   
  8. import com.android.handlers.ListViewHandle;  
  9. import com.android.services.ListViewService;  
  10. import com.android.services.si.IListViewService;  
  11. import com.android.view.ListViewFerris;  
  12. import com.android.view.vi.IListViewFerris;  
  13. import com.android.widget.listview.FerrisListView.OnStartListener;  
  14.   
  15. public class ListViewPresenters {  
  16.     private IListViewFerris iListViewFerris;  
  17.     private IListViewService iListViewService;  
  18.     private FragmentActivity mActivity;  
  19.     private View view;  
  20.     private int index = 1;  
  21.   
  22.     public ListViewPresenters(FragmentActivity mActivity2, View view2) {  
  23.         // TODO Auto-generated constructor stub  
  24.         this.mActivity = mActivity2;  
  25.         this.view = view2;  
  26.         this.iListViewFerris = new ListViewFerris(mActivity, view);  
  27.         this.iListViewService = new ListViewService();  
  28.     }  
  29.       
  30.     /* 
  31.      * 初始化View层里的控件 
  32.      */  
  33.     public void onFindView() {  
  34.         iListViewFerris.onFindView();  
  35.     }  
  36.     /* 
  37.      * 上啦刷新方法 
  38.      */  
  39.     public void listViewRefresh(int index) {  
  40.         //post请求数据,获取数据,并且通过handler接口来通知View更新UI  
  41.         iListViewService.sendPost(index, new ListViewHandle() {  
  42.             @Override  
  43.             public void getData(ArrayList<String> msgs) {  
  44.                 // TODO Auto-generated method stub  
  45.                 //通过handler接口来通知UI去更新数据  
  46.                 iListViewFerris.refresh(msgs);  
  47.             }  
  48.         });  
  49.     }  
  50.     /* 
  51.      * 下拉加载更多方法 
  52.      */  
  53.     public void listViewLoadMore(int index) {  
  54.         //post请求数据,获取数据,并且通过handler接口来通知View更新UI  
  55.         iListViewService.sendPost(index, new ListViewHandle() {  
  56.             @Override  
  57.             public void getData(ArrayList<String> msgs) {  
  58.                 // TODO Auto-generated method stub  
  59.                 //通过handler接口来通知UI去更新数据  
  60.                 if (msgs == null) {  
  61.                     iListViewFerris.showLoadingError();//获取数据失败显示通知  
  62.                     iListViewFerris.loadMore(msgs);//停止加载更多  
  63.                 } else {  
  64.                     iListViewFerris.loadMore(msgs);//停止加载更多  
  65.                 }  
  66.   
  67.             }  
  68.         });  
  69.     }  
  70.     /* 
  71.      * 为Listview设置上拉下拉刷新监听 
  72.      */  
  73.     public void setRefreshOrLoadMoreListem() {  
  74.         // TODO Auto-generated method stub  
  75.   
  76.         iListViewFerris.setRefreshOrLoadMoreListem(new Refresh(),  
  77.                 new Loadmore());  
  78.     }  
  79.   
  80.     /* 
  81.      * 为Listview第一次,自动下拉刷新 
  82.      */  
  83.     public void firstload() {  
  84.         // TODO Auto-generated method stub  
  85.         iListViewFerris.firstLoad();  
  86.     }  
  87.       
  88.     /* 
  89.      * 上拉刷新监听 
  90.      */  
  91.     public class Refresh implements OnStartListener {  
  92.   
  93.         @Override  
  94.         public void onStart() {  
  95.             // TODO Auto-generated method stub  
  96.             index = 1;  
  97.             listViewRefresh(index);  
  98.   
  99.         }  
  100.   
  101.     }  
  102.     /* 
  103.      * 加载更多监听 
  104.      */  
  105.     public class Loadmore implements OnStartListener {  
  106.   
  107.         @Override  
  108.         public void onStart() {  
  109.             // TODO Auto-generated method stub  
  110.             listViewLoadMore(++index);  
  111.         }  
  112.   
  113.     }  
  114.   
  115. }  

2、接着我们来看下UI层,我们需要更新哪些数据,需要为哪个UI去具体更新哪些东西。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.view.vi;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.android.widget.listview.FerrisListView.OnStartListener;  
  6.   
  7. public interface IListViewFerris {  
  8.     public void onFindView();//初始化控件  
  9.     public void showLoadingError();//显示加载错误  
  10.     public void showLoadingSuccess();//显示加成功  
  11.     public void setNotifyListView();//刷新Listview  
  12.     public void refresh(ArrayList<String> msgs);//上拉刷新  
  13.     public void loadMore(ArrayList<String> msgs);//下拉加载更多  
  14.     public void setRefreshOrLoadMoreListem(OnStartListener refresh, OnStartListener loadmore);//设置上拉下拉刷新监听  
  15.     public void firstLoad();//首次自动上拉刷新  
  16. }  

具体UI层实现的具体方法,主要是 上拉刷新,下拉加载更多,显示错误成功状态,以及初始化控件等方法。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.view;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.support.v4.app.FragmentActivity;  
  6. import android.view.View;  
  7.   
  8. import com.android.adapter.ListViewAdapter;  
  9. import com.android.futilssimple.R;  
  10. import com.android.utils.ToastUtils;  
  11. import com.android.view.vi.IListViewFerris;  
  12. import com.android.widget.listview.FerrisListView;  
  13. import com.android.widget.listview.FerrisListView.OnStartListener;  
  14. import com.android.widget.listview.SimpleFooter;  
  15. import com.android.widget.listview.SimpleHeader;  
  16.   
  17. public class ListViewFerris implements IListViewFerris{  
  18.     private FragmentActivity mActivity;  
  19.     private View view;  
  20.     private FerrisListView listView;  
  21.     private ListViewAdapter adapter;  
  22.     public ListViewFerris(FragmentActivity mActivity,View view) {  
  23.         // TODO Auto-generated constructor stub  
  24.         this.mActivity=mActivity;  
  25.         this.view=view;  
  26.     }  
  27.   
  28.     //初始化view  
  29.     @Override  
  30.     public void onFindView() {  
  31.         // TODO Auto-generated method stub  
  32.         if(mActivity==null||view==null){  
  33.             return;  
  34.         }  
  35.           
  36.         listView = (FerrisListView)view.findViewById(R.id.zListView);  
  37.         adapter=new ListViewAdapter(mActivity);  
  38.           
  39.         // 设置默认偏移量,主要用于实现透明标题栏功能。(可选)  
  40.         float density = mActivity.getResources().getDisplayMetrics().density;  
  41.         listView.setFirstTopOffset((int) (50 * density));  
  42.   
  43.         // 设置下拉刷新的样式(可选,但如果没有Header则无法下拉刷新)  
  44.         SimpleHeader header = new SimpleHeader(mActivity);  
  45.         header.setTextColor(0xff0066aa);  
  46.         header.setCircleColor(0xff33bbee);  
  47.         listView.setHeadable(header);  
  48.   
  49.         // 设置加载更多的样式(可选)  
  50.         SimpleFooter footer = new SimpleFooter(mActivity);  
  51.         footer.setCircleColor(0xff33bbee);  
  52.         listView.setFootable(footer);  
  53.   
  54.     }  
  55.       
  56.   
  57.     //显示加载失败  
  58.     @Override  
  59.     public void showLoadingError() {  
  60.         // TODO Auto-generated method stub  
  61.         ToastUtils.showToast(mActivity, "加载失败");  
  62.     }  
  63.   
  64.     //显示加载成功  
  65.     @Override  
  66.     public void showLoadingSuccess() {  
  67.         // TODO Auto-generated method stub  
  68.         ToastUtils.showToast(mActivity, "加载成功");  
  69.     }  
  70.   
  71.       
  72.     //刷新数据  
  73.     @Override  
  74.     public void setNotifyListView() {  
  75.         // TODO Auto-generated method stub  
  76.         if(adapter!=null){  
  77.             adapter.notifyDataSetChanged();  
  78.         }  
  79.     }  
  80.   
  81.     //填充刷新数据  
  82.     @Override  
  83.     public void refresh(ArrayList<String> msgs) {  
  84.         // TODO Auto-generated method stub  
  85.         if(msgs!=null&&msgs.size()>0){  
  86.             if(listView.getAdapter()==null){  
  87.                 listView.setAdapter(adapter);  
  88.                 adapter.setRefresh(msgs);  
  89.             }else{  
  90.                   
  91.                 adapter.setRefresh(msgs);  
  92.             }  
  93.             listView.setRefreshSuccess("加载成功"); // 通知加载成功  
  94.             listView.startLoadMore(); // 开启LoadingMore功能  
  95.         }else{  
  96.             listView.setRefreshFail("加载失败");  
  97.         }  
  98.           
  99.     }  
  100.   
  101.     //填充加载更多数据  
  102.     @Override  
  103.     public void loadMore(ArrayList<String> msgs) {  
  104.         // TODO Auto-generated method stub  
  105.         if(msgs!=null&&msgs.size()>0){  
  106.             if(listView.getAdapter()==null){  
  107.                 listView.setAdapter(adapter);  
  108.                 adapter.setData(msgs);  
  109.             }else{  
  110.                 adapter.setData(msgs);  
  111.             }  
  112.               
  113.             listView.setLoadMoreSuccess();  
  114.         }else{  
  115.             listView.stopLoadMore();  
  116.         }  
  117.           
  118.           
  119.     }  
  120.   
  121.     //为Listview设置首次自动上拉刷新  
  122.     @Override  
  123.     public void firstLoad(){  
  124.         listView.refresh(); // 主动下拉刷新  
  125.     }  
  126.       
  127.     //为Listview设置上拉以及下拉刷新  
  128.     @Override  
  129.     public void setRefreshOrLoadMoreListem(OnStartListener refresh,  
  130.             OnStartListener loadmore) {  
  131.         // TODO Auto-generated method stub  
  132.         listView.setOnRefreshStartListener(refresh);  
  133.         listView.setOnLoadMoreStartListener(loadmore);  
  134.     }  
  135.   
  136.       
  137. }  

3、我们来看下业务逻辑层,主要是通过模拟POST在后台请求数据,然后将获取的数据,返回给P层,由P层去将数据交予V层来更新UI界面。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.services.si;  
  2.   
  3. import com.android.handlers.ListViewHandle;  
  4.   
  5. public interface IListViewService {  
  6.       
  7.     //发送post请求  
  8.     public void sendPost(int index,ListViewHandle handle);  
  9. }  
业务逻辑才具体实现的功能如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.services;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.os.Handler;  
  6.   
  7. import com.android.futils.task.FTaskPool;  
  8. import com.android.futils.task.TaskItem;  
  9. import com.android.handlers.ListViewHandle;  
  10. import com.android.services.si.IListViewService;  
  11.   
  12. public class ListViewService implements IListViewService {  
  13.     String[] data={"加拿大","瑞典","澳大利亚","瑞士","新西兰","挪威","丹麦","芬兰","奥地利","荷兰","德国","日本","比利时","意大利","英国"};  
  14.     public ListViewService() {  
  15.         // TODO Auto-generated constructor stub  
  16.     }  
  17.       
  18.     private Handler handler=new Handler();  
  19.     private ArrayList<String> msgs;  
  20.   
  21.     @Override  
  22.     public void sendPost(int index, ListViewHandle handle) {  
  23.         // TODO Auto-generated method stub  
  24.         switch (index) {  
  25.         case 1:  
  26.             getData(index,handle);  
  27.             break;  
  28.         case 2:  
  29.             getData(index,handle);  
  30.             break;  
  31.         case 3:  
  32.             getData(index,handle);  
  33.             break;  
  34.         case 4:  
  35.             getData(index,handle);  
  36.             break;  
  37.         case 5:  
  38.             getData(index,handle);  
  39.             break;  
  40.         case 6:  
  41.             getData(index,handle);  
  42.             break;  
  43.         default:  
  44.             msgs=null;  
  45.             handle.getData(msgs);  
  46.             break;  
  47.         }  
  48.     }  
  49.   
  50.     private synchronized void getData(final int index, final ListViewHandle handle) {  
  51.         // TODO Auto-generated method stub  
  52.           handler.postDelayed(new Runnable() {  
  53.                 @Override  
  54.                 public void run() {  
  55.                     FTaskPool.getInstance().execute(new TaskItem() {  
  56.                           
  57.                         @Override  
  58.                         public void doMain() {//在前台显示数据  
  59.                             // TODO Auto-generated method stub  
  60.                             if(handle!=null){  
  61.                                 handle.getData(msgs);  
  62.                             }  
  63.                           
  64.                         }  
  65.                           
  66.                         @Override  
  67.                         public void doBack() {//在后台处理数据  
  68.                             // TODO Auto-generated method stub  
  69.                             msgs=new ArrayList<String>();  
  70.                             for(String d:data){  
  71.                                 msgs.add(index+"、"+d);  
  72.                             }  
  73.                         }  
  74.                     });  
  75.                 }  
  76.             }, 2 * 1000);//延迟2秒后执行  
  77.           
  78.   
  79.           
  80.     }  
  81.   
  82.   
  83. }  


4、最后,我们来看下Fragment里面如来调用这个P层,来控制MV进行数据的获取以及更新

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.android.fragment;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8.   
  9. import com.android.futilssimple.R;  
  10. import com.android.presenters.ListViewPresenters;  
  11.   
  12. public class ListViewFragment extends Fragment {  
  13.     private ListViewPresenters listViewPresenters;  
  14.   
  15.     public ListViewFragment() {  
  16.     }  
  17.     
  18.     @Override  
  19.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  20.             Bundle savedInstanceState) {  
  21.         View rootView = inflater.inflate(R.layout.listviewfragment, container, false);  
  22.         listViewPresenters=new ListViewPresenters(getActivity(), rootView);//新建一个控制器  
  23.         listViewPresenters.onFindView();//初始化view  
  24.         listViewPresenters.setRefreshOrLoadMoreListem();//设置刷新监听  
  25.         listViewPresenters.firstload();//首次自动上拉刷新  
  26.         return rootView;  
  27.     }  
  28.   
  29.       
  30.      
  31.    
  32. }  


5、源码demo

http://download.csdn.net/detail/xufeifandj/8369037



0 1
原创粉丝点击