使用SwipeRefreshLayout实现下拉刷新与上拉加载更多

时间:2022-12-22 22:05:25

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

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