SwipeRefreshLayout只能实现下拉刷新,而不能实现上拉加载更多。所以这需要对其进行扩充。

1、首先继承SwipeRefreshLayout

public class SwipeRefreshAndMoreLoadLayout extends SwipeRefreshLayout implements OnScrollListener {

接下来直接替代码了

packagecom.example.swiperefreshlayout;importandroid.content.Context;importandroid.support.v4.widget.SwipeRefreshLayout;importandroid.util.AttributeSet;importandroid.util.Log;importandroid.view.LayoutInflater;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.ViewConfiguration;importandroid.widget.AbsListView;importandroid.widget.AbsListView.OnScrollListener;importandroid.widget.ListAdapter;importandroid.widget.ListView;importandroid.widget.TextView;publicclassSwipeRefreshAndMoreLoadLayoutextendsSwipeRefreshLayoutimplementsOnScrollListener{/***滑动到最下面时的上拉操作*/privateintmTounchslop;/***ListView的加载中footer*/privateViewmListViewFooter;privateListViewmListView;/***按下时的y坐标*/privateintmYdown;privateintmYlast;privatebooleanisLoading=false;privateOnLoadMoreListenermOnLoadMoreListener;privateTextViewmTvLoadMore;privateintmVisibleItemCount;privateintmTotalItemCount;publicSwipeRefreshAndMoreLoadLayout(Contextcontext){this(context,null);}publicSwipeRefreshAndMoreLoadLayout(Contextcontext,AttributeSetattrs){super(context,attrs);mTounchslop=ViewConfiguration.get(context).getScaledTouchSlop();mListViewFooter=LayoutInflater.from(context).inflate(R.layout.footer_item,null);mTvLoadMore=(TextView)mListViewFooter.findViewById(R.id.tv_loadmore);}@OverrideprotectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){super.onLayout(changed,left,top,right,bottom);//初始化ListViewif(mListView==null){getListView();}}/***获取ListView对象*/privatevoidgetListView(){intchildCount=getChildCount();if(childCount>0){for(inti=0;i<childCount;i++){Viewchild=getChildAt(i);if(childinstanceofListView){mListView=(ListView)child;//设置滚动监听器给ListView,使得滚动的情况下也可以自动加载mListView.setOnScrollListener(this);}}}}@OverridepublicbooleandispatchTouchEvent(MotionEventev){intaction=ev.getAction();switch(action){caseMotionEvent.ACTION_DOWN:mYdown=(int)ev.getY();break;caseMotionEvent.ACTION_MOVE:mYlast=(int)ev.getY();break;caseMotionEvent.ACTION_UP:if(canLoad()){loadData();}break;default:break;}returnsuper.dispatchTouchEvent(ev);}publicvoidsetAdapte(ListViewlistView,ListAdapteradapter){if(listView!=null){listView.addFooterView(mListViewFooter);listView.setAdapter(adapter);listView.removeFooterView(mListViewFooter);}}privatebooleancanLoad(){return!isLoading&&isPullup()&&isBottom();}privatebooleanenableBottomLoad(){return!isLoading&&isBottom();}privatebooleanisBottom(){if(mListView!=null&&mListView.getAdapter()!=null){returnmVisibleItemCount<mTotalItemCount&&mListView.getLastVisiblePosition()==mListView.getAdapter().getCount()-1;}returnfalse;}privatebooleanisPullup(){returnmYdown-mYlast>=mTounchslop;}privatevoidloadData(){if(mOnLoadMoreListener!=null){setLoading(true);mOnLoadMoreListener.onLoadMore();}}publicvoidsetLoading(booleanloading){isLoading=loading;if(loading){mListView.addFooterView(mListViewFooter);}else{mListView.removeFooterView(mListViewFooter);mYdown=0;mYlast=0;}}publicvoidsetLoadingContext(Stringstring){mTvLoadMore.setText(string);}publicvoidsetLoadingContext(intresId){mTvLoadMore.setText(resId);}@OverridepublicvoidonScrollStateChanged(AbsListViewview,intscrollState){}@OverridepublicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){mVisibleItemCount=visibleItemCount;mTotalItemCount=totalItemCount;if(visibleItemCount<totalItemCount&&enableBottomLoad()){loadData();}}publicvoidsetOnLoadMoreListener(OnLoadMoreListenerlistener){mOnLoadMoreListener=listener;}publicstaticinterfaceOnLoadMoreListener{voidonLoadMore();}}


packagecom.example.swiperefreshlayout;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;importandroid.view.Menu;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ListView;importandroid.widget.TextView;importcom.example.swiperefreshlayout.SwipeRefreshAndMoreLoadLayout.OnLoadMoreListener;@SuppressLint("InlinedApi")publicclassMainActivityextendsActivityimplementsOnRefreshListener,OnLoadMoreListener{privateSwipeRefreshAndMoreLoadLayoutmRefreshLayout;privateListViewmListView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView=(ListView)findViewById(R.id.lv_listview);mRefreshLayout=(SwipeRefreshAndMoreLoadLayout)findViewById(R.id.refresh);mRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light,android.R.color.holo_green_light,android.R.color.holo_orange_light,android.R.color.holo_red_light);mRefreshLayout.setOnRefreshListener(this);mRefreshLayout.setOnLoadMoreListener(this);mRefreshLayout.setAdapte(mListView,newMyAdapter());}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverridepublicvoidonRefresh(){newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){mRefreshLayout.setRefreshing(false);}},5000);}@OverridepublicvoidonLoadMore(){mRefreshLayout.setLoadingContext("正在加载");newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){mRefreshLayout.setLoading(false);}},5000);}classMyAdapterextendsBaseAdapter{@OverridepublicintgetCount(){return30;}@OverridepublicObjectgetItem(intposition){//TODOAuto-generatedmethodstubreturnnull;}@OverridepubliclonggetItemId(intposition){//TODOAuto-generatedmethodstubreturn0;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){Viewinflate=null;TextViewtvItem=null;if(convertView==null){inflate=getLayoutInflater().inflate(R.layout.listview_item,null);tvItem=(TextView)inflate.findViewById(R.id.tv_item);inflate.setTag(tvItem);}else{inflate=convertView;tvItem=(TextView)inflate.getTag();}tvItem.setText("下拉刷新item"+position);returninflate;}}}

<com.example.swiperefreshlayout.SwipeRefreshAndMoreLoadLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/refresh"tools:context=".MainActivity"><ListViewandroid:id="@+id/lv_listview"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></com.example.swiperefreshlayout.SwipeRefreshAndMoreLoadLayout>

源代码链接:http://download.csdn.net/detail/dennisruan/9433709