多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android MVP設計框架模板 之 漂亮ListView上拉刷新下拉加載更多

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



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 羞羞网页登界面入口 | 国产精品12 | 综合自拍亚洲综合图区美腿丝袜 | 精品国产理论在线观看不卡 | 欧洲福利视频 | 久久精品无码一区二区日韩av | 九九精品免视看国产成人 | www.亚洲精品.com | 国产高清精品入口91 | 成人在线欧美 | 爱爱a | 欧美韩国 | 久久久久国产一级毛片高清片 | 亚洲欧美精品在线 | 精品一区二区三区四区乱码 | 亚洲图片另类图片 | 女人18毛片a级毛片免费视频 | 伊人影院综合 | 欧美一级高清免费a | 国产欧美中文字幕 | 欧美成a人片在线观看 | 国产日产欧美一区二区三区 | 国产亚洲精品久久久久久久久激情 | 免费福利在线 | 亚洲国产成人久久 | 欧美黑人粗暴另类多交 | 免费在线视频网站 | 99久久精品免费国产一区二区三区 | 综合久青草视频 | 欧美一区二区自偷自拍视频 | 中文精品久久久久国产网站 | 三浦惠理子中文字幕在线一区二区 | 黄色网址www| 影音先锋 色天使 | 性欧美精品久久久久久久 | 国产午夜永久福利视频在线观看 | 成人久久久 | 日本道在线视频 | 久久久久久一品道精品免费看 | 久久精品国产一区二区三区不卡 | 日韩一级欧美一级毛片在线 |