使用SwipeRefreshLayout实现下拉刷新与上拉加载更多
2016-02-16 23:29
519 查看
SwipeRefreshLayout只能实现下拉刷新,而不能实现上拉加载更多。所以这需要对其进行扩充。
1、首先继承SwipeRefreshLayout
public class SwipeRefreshAndMoreLoadLayout extends SwipeRefreshLayout implements OnScrollListener {
接下来直接替代码了
源代码链接:http://download.csdn.net/detail/dennisruan/9433709
1、首先继承SwipeRefreshLayout
public class SwipeRefreshAndMoreLoadLayout extends SwipeRefreshLayout implements OnScrollListener {
接下来直接替代码了
package com.example.swiperefreshlayout; import android.content.Context; import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; public class SwipeRefreshAndMoreLoadLayout extends SwipeRefreshLayout implements OnScrollListener { /** * 滑动到最下面时的上拉操作 */ private int mTounchslop; /** * ListView的加载中footer */ private View mListViewFooter; private ListView mListView; /** * 按下时的y坐标 */ private int mYdown; private int mYlast; private boolean isLoading = false; private OnLoadMoreListener mOnLoadMoreListener; private TextView mTvLoadMore; private int mVisibleItemCount; private int mTotalItemCount; public SwipeRefreshAndMoreLoadLayout(Context context) { this(context, null); } public SwipeRefreshAndMoreLoadLayout(Context context, AttributeSet attrs) { 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); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); //初始化ListView if (mListView == null) { getListView(); } } /** * 获取ListView对象 */ private void getListView() { int childCount = getChildCount(); if (childCount > 0) { for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if (child instanceof ListView) { mListView = (ListView)child; // 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载 mListView.setOnScrollListener(this); } } } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: mYdown = (int)ev.getY(); break; case MotionEvent.ACTION_MOVE: mYlast = (int)ev.getY(); break; case MotionEvent.ACTION_UP: if (canLoad()) { loadData(); } break; default: break; } return super.dispatchTouchEvent(ev); } public void setAdapte(ListView listView, ListAdapter adapter) { if (listView != null) { listView.addFooterView(mListViewFooter);//先保证添加footerView listView.setAdapter(adapter); listView.removeFooterView(mListViewFooter);//这里不需要footerView } } private boolean canLoad() { return !isLoading && isPullup() && isBottom(); } private boolean enableBottomLoad() { return !isLoading && isBottom(); } private boolean isBottom() { if (mListView != null && mListView.getAdapter() != null) { return mVisibleItemCount < mTotalItemCount && mListView.getLastVisiblePosition() == mListView.getAdapter().getCount()-1; } return false; } private boolean isPullup() { return mYdown-mYlast >= mTounchslop; } private void loadData() { if (mOnLoadMoreListener != null) { setLoading(true); mOnLoadMoreListener.onLoadMore(); } } public void setLoading(boolean loading) { isLoading = loading; if (loading) { mListView.addFooterView(mListViewFooter); } else { mListView.removeFooterView(mListViewFooter); mYdown = 0; mYlast = 0; } } public void setLoadingContext(String string) { mTvLoadMore.setText(string); } public void setLoadingContext(int resId) { mTvLoadMore.setText(resId); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { mVisibleItemCount = visibleItemCount; mTotalItemCount = totalItemCount; if (visibleItemCount < totalItemCount && enableBottomLoad()) { loadData(); } } public void setOnLoadMoreListener(OnLoadMoreListener listener) { mOnLoadMoreListener = listener; } public static interface OnLoadMoreListener { void onLoadMore(); } }
package com.example.swiperefreshlayout; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.example.swiperefreshlayout.SwipeRefreshAndMoreLoadLayout.OnLoadMoreListener; @SuppressLint("InlinedApi") public class MainActivity extends Activity implements OnRefreshListener, OnLoadMoreListener { private SwipeRefreshAndMoreLoadLayout mRefreshLayout; private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { 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, new MyAdapter());//这里使用SwipeRefreshAndMoreLoadLayout中的setAdapter(),否则会出现<span style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;color:#ff0000;line-height: 16.79px; white-space: pre;">HeaderViewListAdapter</span><span style="font-size:14px;white-space: pre;">转换异常</span> } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { mRefreshLayout.setRefreshing(false); } }, 5000); } @Override public void onLoadMore() { mRefreshLayout.setLoadingContext("正在加载"); new Handler().postDelayed(new Runnable() { @Override public void run() { mRefreshLayout.setLoading(false); } }, 5000); } class MyAdapter extends BaseAdapter { @Override public int getCount() { return 30; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View inflate = null; TextView tvItem = 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); return inflate; } } }
<com.example.swiperefreshlayout.SwipeRefreshAndMoreLoadLayout xmlns: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" > <ListView android: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
相关文章推荐
- 超好看的下拉刷新动画Android代码实现
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能(附源码)
- Android下拉刷新官方版
- Android下拉刷新ListView――RTPullListView(demo)
- Android下拉刷新上拉加载更多左滑动删除
- APP中javascript+css3实现下拉刷新效果
- Android实现上拉加载更多以及下拉刷新功能(ListView)
- Android笔记之:App列表之下拉刷新的使用
- Swift版使用ThPullRefresh实现下拉上拉刷新数据
- 自定义可以下拉刷新的listview
- UIRefreshControl使用总结
- SwipeRefreshLayout 与 CoordinatorLayout 嵌套刷新
- 纯javascript实现简单下拉刷新功能
- 10个Android下拉刷新控件收集
- PullToRefreshListView 应用讲解
- ListView下拉刷新
- http://blog.csdn.net/djxiaoyu_haha/article/details/38315341
- 使用PullToRefresh实现下拉刷新和上拉加载
- 【无限互联】下拉刷新控件
- 【无限互 联】下拉刷新EGORefreshTableHeaderView的使用