Android MVP設計框架模板 之 漂亮ListView上拉刷新下拉加載更多
來源:程序員人生 發布時間:2015-01-21 08:53:55 閱讀次數:6973次
mvp的全稱為Model-View-Presenter,Model提供數據,View負責顯示,Controller/Presenter負責邏輯的處理。MVP與MVC有著1個重大的區分:在MVP中View其實不直接使用Model,它們之間的通訊是通過Presenter
(MVC中的Controller)來進行的,所有的交互都產生在Presenter內部,而在MVC中View會直接從Model中讀取數據而不是通過 Controller。
項目中大部份是面對接口編程,通過P層可以預先將所有需要的接口功能寫出來,進而進行實現,大大提高了項目高內聚,低耦合。合適于團隊開發項目。
今天我們是用MVP的設計框架模板來實現1個ListView的上拉刷新下拉加載更多的功能。
項目結構以下圖;

1、首先我們ListViewPresenters.java類,他的作用是,控制M業務邏輯層,去獲得我們想要的數據,然后通知V層去更新他們對應的UI。由于我們的需求明確,就是實現Listview的上拉刷新,下拉加載更多,初始化控件,設置上拉下拉刷新監聽。因此我們可以先把功能接口都寫好,讓ListViewPresenters去實現其功能便可。
package com.android.presenters;
import java.util.ArrayList;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import com.android.handlers.ListViewHandle;
import com.android.services.ListViewService;
import com.android.services.si.IListViewService;
import com.android.view.ListViewFerris;
import com.android.view.vi.IListViewFerris;
import com.android.widget.listview.FerrisListView.OnStartListener;
public class ListViewPresenters {
private IListViewFerris iListViewFerris;
private IListViewService iListViewService;
private FragmentActivity mActivity;
private View view;
private int index = 1;
public ListViewPresenters(FragmentActivity mActivity2, View view2) {
// TODO Auto-generated constructor stub
this.mActivity = mActivity2;
this.view = view2;
this.iListViewFerris = new ListViewFerris(mActivity, view);
this.iListViewService = new ListViewService();
}
/*
* 初始化View層里的控件
*/
public void onFindView() {
iListViewFerris.onFindView();
}
/*
* 上啦刷新方法
*/
public void listViewRefresh(int index) {
//post要求數據,獲得數據,并且通過handler接口來通知View更新UI
iListViewService.sendPost(index, new ListViewHandle() {
@Override
public void getData(ArrayList<String> msgs) {
// TODO Auto-generated method stub
//通過handler接口來通知UI去更新數據
iListViewFerris.refresh(msgs);
}
});
}
/*
* 下拉加載更多方法
*/
public void listViewLoadMore(int index) {
//post要求數據,獲得數據,并且通過handler接口來通知View更新UI
iListViewService.sendPost(index, new ListViewHandle() {
@Override
public void getData(ArrayList<String> msgs) {
// TODO Auto-generated method stub
//通過handler接口來通知UI去更新數據
if (msgs == null) {
iListViewFerris.showLoadingError();//獲得數據失敗顯示通知
iListViewFerris.loadMore(msgs);//停止加載更多
} else {
iListViewFerris.loadMore(msgs);//停止加載更多
}
}
});
}
/*
* 為Listview設置上拉下拉刷新監聽
*/
public void setRefreshOrLoadMoreListem() {
// TODO Auto-generated method stub
iListViewFerris.setRefreshOrLoadMoreListem(new Refresh(),
new Loadmore());
}
/*
* 為Listview第1次,自動下拉刷新
*/
public void firstload() {
// TODO Auto-generated method stub
iListViewFerris.firstLoad();
}
/*
* 上拉刷新監聽
*/
public class Refresh implements OnStartListener {
@Override
public void onStart() {
// TODO Auto-generated method stub
index = 1;
listViewRefresh(index);
}
}
/*
* 加載更多監聽
*/
public class Loadmore implements OnStartListener {
@Override
public void onStart() {
// TODO Auto-generated method stub
listViewLoadMore(++index);
}
}
}
2、接著我們來看下UI層,我們需要更新哪些數據,需要為哪一個UI去具體更新哪些東西。
package com.android.view.vi;
import java.util.ArrayList;
import com.android.widget.listview.FerrisListView.OnStartListener;
public interface IListViewFerris {
public void onFindView();//初始化控件
public void showLoadingError();//顯示加載毛病
public void showLoadingSuccess();//顯示加成功
public void setNotifyListView();//刷新Listview
public void refresh(ArrayList<String> msgs);//上拉刷新
public void loadMore(ArrayList<String> msgs);//下拉加載更多
public void setRefreshOrLoadMoreListem(OnStartListener refresh, OnStartListener loadmore);//設置上拉下拉刷新監聽
public void firstLoad();//首次自動上拉刷新
}
具體UI層實現的具體方法,主要是 上拉刷新,下拉加載更多,顯示毛病成功狀態,和初始化控件等方法。
package com.android.view;
import java.util.ArrayList;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import com.android.adapter.ListViewAdapter;
import com.android.futilssimple.R;
import com.android.utils.ToastUtils;
import com.android.view.vi.IListViewFerris;
import com.android.widget.listview.FerrisListView;
import com.android.widget.listview.FerrisListView.OnStartListener;
import com.android.widget.listview.SimpleFooter;
import com.android.widget.listview.SimpleHeader;
public class ListViewFerris implements IListViewFerris{
private FragmentActivity mActivity;
private View view;
private FerrisListView listView;
private ListViewAdapter adapter;
public ListViewFerris(FragmentActivity mActivity,View view) {
// TODO Auto-generated constructor stub
this.mActivity=mActivity;
this.view=view;
}
//初始化view
@Override
public void onFindView() {
// TODO Auto-generated method stub
if(mActivity==null||view==null){
return;
}
listView = (FerrisListView)view.findViewById(R.id.zListView);
adapter=new ListViewAdapter(mActivity);
// 設置默許偏移量,主要用于實現透明標題欄功能。(可選)
float density = mActivity.getResources().getDisplayMetrics().density;
listView.setFirstTopOffset((int) (50 * density));
// 設置下拉刷新的樣式(可選,但如果沒有Header則沒法下拉刷新)
SimpleHeader header = new SimpleHeader(mActivity);
header.setTextColor(0xff0066aa);
header.setCircleColor(0xff33bbee);
listView.setHeadable(header);
// 設置加載更多的樣式(可選)
SimpleFooter footer = new SimpleFooter(mActivity);
footer.setCircleColor(0xff33bbee);
listView.setFootable(footer);
}
//顯示加載失敗
@Override
public void showLoadingError() {
// TODO Auto-generated method stub
ToastUtils.showToast(mActivity, "加載失敗");
}
//顯示加載成功
@Override
public void showLoadingSuccess() {
// TODO Auto-generated method stub
ToastUtils.showToast(mActivity, "加載成功");
}
//刷新數據
@Override
public void setNotifyListView() {
// TODO Auto-generated method stub
if(adapter!=null){
adapter.notifyDataSetChanged();
}
}
//填充刷新數據
@Override
public void refresh(ArrayList<String> msgs) {
// TODO Auto-generated method stub
if(msgs!=null&&msgs.size()>0){
if(listView.getAdapter()==null){
listView.setAdapter(adapter);
adapter.setRefresh(msgs);
}else{
adapter.setRefresh(msgs);
}
listView.setRefreshSuccess("加載成功"); // 通知加載成功
listView.startLoadMore(); // 開啟LoadingMore功能
}else{
listView.setRefreshFail("加載失敗");
}
}
//填充加載更多數據
@Override
public void loadMore(ArrayList<String> msgs) {
// TODO Auto-generated method stub
if(msgs!=null&&msgs.size()>0){
if(listView.getAdapter()==null){
listView.setAdapter(adapter);
adapter.setData(msgs);
}else{
adapter.setData(msgs);
}
listView.setLoadMoreSuccess();
}else{
listView.stopLoadMore();
}
}
//為Listview設置首次自動上拉刷新
@Override
public void firstLoad(){
listView.refresh(); // 主動下拉刷新
}
//為Listview設置上拉和下拉刷新
@Override
public void setRefreshOrLoadMoreListem(OnStartListener refresh,
OnStartListener loadmore) {
// TODO Auto-generated method stub
listView.setOnRefreshStartListener(refresh);
listView.setOnLoadMoreStartListener(loadmore);
}
}
3、我們來看下業務邏輯層,主要是通過摹擬POST在后臺要求數據,然后將獲得的數據,返回給P層,由P層去將數據交予V層來更新UI界面。
package com.android.services.si;
import com.android.handlers.ListViewHandle;
public interface IListViewService {
//發送post要求
public void sendPost(int index,ListViewHandle handle);
}
業務邏輯才具體實現的功能以下:
package com.android.services;
import java.util.ArrayList;
import android.os.Handler;
import com.android.futils.task.FTaskPool;
import com.android.futils.task.TaskItem;
import com.android.handlers.ListViewHandle;
import com.android.services.si.IListViewService;
public class ListViewService implements IListViewService {
String[] data={"加拿大","瑞典","澳大利亞","瑞士","新西蘭","挪威","丹麥","芬蘭","奧地利","荷蘭","德國","日本","比利時","意大利","英國"};
public ListViewService() {
// TODO Auto-generated constructor stub
}
private Handler handler=new Handler();
private ArrayList<String> msgs;
@Override
public void sendPost(int index, ListViewHandle handle) {
// TODO Auto-generated method stub
switch (index) {
case 1:
getData(index,handle);
break;
case 2:
getData(index,handle);
break;
case 3:
getData(index,handle);
break;
case 4:
getData(index,handle);
break;
case 5:
getData(index,handle);
break;
case 6:
getData(index,handle);
break;
default:
msgs=null;
handle.getData(msgs);
break;
}
}
private synchronized void getData(final int index, final ListViewHandle handle) {
// TODO Auto-generated method stub
handler.postDelayed(new Runnable() {
@Override
public void run() {
FTaskPool.getInstance().execute(new TaskItem() {
@Override
public void doMain() {//在前臺顯示數據
// TODO Auto-generated method stub
if(handle!=null){
handle.getData(msgs);
}
}
@Override
public void doBack() {//在后臺處理數據
// TODO Auto-generated method stub
msgs=new ArrayList<String>();
for(String d:data){
msgs.add(index+"、"+d);
}
}
});
}
}, 2 * 1000);//延遲2秒后履行
}
}
4、最后,我們來看下Fragment里面如來調用這個P層,來控制MV進行數據的獲得和更新
package com.android.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.futilssimple.R;
import com.android.presenters.ListViewPresenters;
public class ListViewFragment extends Fragment {
private ListViewPresenters listViewPresenters;
public ListViewFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.listviewfragment, container, false);
listViewPresenters=new ListViewPresenters(getActivity(), rootView);//新建1個控制器
listViewPresenters.onFindView();//初始化view
listViewPresenters.setRefreshOrLoadMoreListem();//設置刷新監聽
listViewPresenters.firstload();//首次自動上拉刷新
return rootView;
}
}
5、源碼demo
http://download.csdn.net/detail/xufeifandj/8369037
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈