google官方的下拉刷新+自定义上拉加载更多
现在很多app都是使用的自定义的下拉刷新上拉加载更多,然而google官方为我们提供了下拉刷新操作,我在之前的博客中有撰文针对
自定义下拉刷新操作并提供源码下载 传送门 自定义下拉刷新及上拉加载更多
google官方的下拉刷新 传送门 google官方的下拉刷新组件的详细介绍及示例下载
google官方为我们提供了下拉刷新,我们自己增加自定义的上拉加载更多,这样相互结合使用,就出现了一款新的下拉刷新和上拉加载更多的组件,非常推荐在app中增加这中效果。先来看看效果如何,如下gif图,是不是给人耳目一新的感觉呢,最下面提供示例代码供下载学习。
1、自定义listView,因为google为我们提供能下拉刷新的组件
android.support.v4.widget.SwipeRefreshLayout
因此我们只需要为自定的listView添加上拉“ 加载更多 ”的功能。
自定义上拉加载更多的listView代码如下:
package com.example.myfirst.pulltorefreshlist;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* 上拉加载更多的listView,配合Google官方的下拉刷新使用
* Created by chengguo on 2016/3/21.
*/
public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = "RefreshListView";
/**
* 底部加载更多部分
*/
private boolean isScrollToBottom;//判断是不是滑到了底部
private View footerView; //底部的footer view
private int footerViewHeight; //底部view的高度
private boolean isLoadingMore = false; //判断是不是"加载更多"
/**
* listview的接口,监听listview的下来刷新和上拉加载更多
*/
private OnRefreshListener mOnRefreshListener;
public LoadMoreListView(Context context) {
super(context);
}
public LoadMoreListView(Context context, AttributeSet attrs) {
super(context, attrs);
initFooterView();
this.setOnScrollListener(this);
}
/**
* 初始化底部view
*/
private void initFooterView() {
footerView = View.inflate(getContext(), R.layout.footer_layout, null);
//设置(0,0)以便系统测量footerView的宽高
footerView.measure(0, 0);
footerViewHeight = footerView.getMeasuredHeight();
footerView.setPadding(0, -footerViewHeight, 0, 0);
this.addFooterView(footerView);
}
/**
* 监听listview滚动的状态变化,如果滑到了底部,就“加载更多..."
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING) {
if (isScrollToBottom && !isLoadingMore) {
isLoadingMore = true;
footerView.setPadding(0, 0, 0, 0);
this.setSelection(this.getCount());
if (mOnRefreshListener != null) {
mOnRefreshListener.onLoadingMore();
}
}
}
}
/**
* 监听listview滚动的状态变化,判断当前是不是滑到了底部
*
* @param view
* @param firstVisibleItem
* @param visibleItemCount
* @param totalItemCount
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (getLastVisiblePosition() == (totalItemCount - 1)) {
isScrollToBottom = true;
} else {
isScrollToBottom = false;
}
}
/**
* 设置监听接口,当为
*
* @param listener
*/
public void setOnRefreshListener(OnRefreshListener listener) {
mOnRefreshListener = listener;
}
/**
* 为外界提供的方法,当Activity中的加载更多数据加载完后,就调用这个方法来隐藏底部的footerView
*/
public void loadMoreComplete() {
footerView.setPadding(0, -footerViewHeight, 0, 0);
isLoadingMore = false;
}
/**
* 设置接口,供外界实现,监听listview的刷新和加载更多的状态
*/
public interface OnRefreshListener {
/**
* 上拉加载更多
*/
void onLoadingMore();
}
}
2、activity的layout.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_google_and_loadmore_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.myfirst.pulltorefreshlist.LoadMoreListView
android:id="@+id/google_and_loadmore_refresh_listview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.example.myfirst.pulltorefreshlist.LoadMoreListView>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
3、主activity的代码如下,也有非常详细的代码注释,非常简单,这样一款google下拉刷新+自定义上拉加载更多就诞生了。
package com.example.myfirst.pulltorefreshlist;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import java.util.ArrayList;
/**
* google下拉刷新和自定义上拉加载更多的activity
* Created by chengguo on 2016/3/21.
*/
public class GoogleAndLoadMoreActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener, LoadMoreListView.OnRefreshListener {
private SwipeRefreshLayout swipeRefreshLayout;
private LoadMoreListView loadMoreListView;
//对象数据集合
private ArrayList<ListViewItem> items;
//listview的数据加载器adapter
private RefreshListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.google_and_loadmor_refreshing_aty);
initView();
initEvent();
initData();
}
/**
* 初始化列表数据
*/
private void initData() {
items = new ArrayList<ListViewItem>();
//这里只是模拟10个列表项数据,在现实开发中,listview中的数据都是从服务器获取的。
for (int i = 0; i < 10; i++) {
ListViewItem item = new ListViewItem();
item.setUserImg(R.mipmap.ic_launcher);
item.setUserName("seven" + i);
item.setUserComment("这是google官方一个下拉刷新ListView+自定义ListView上拉加载跟多");
items.add(item);
}
//为listview配置adapter
adapter = new RefreshListAdapter(GoogleAndLoadMoreActivity.this, items);
loadMoreListView.setAdapter(adapter);
}
/**
* 给控件添加事件
*/
private void initEvent() {
swipeRefreshLayout.setOnRefreshListener(this);
//设置圆圈进度条的背景颜色
// swipeRefreshLayout.setProgressBackgroundColorSchemeColor(
// getResources().getColor(R.color.colorPrimary));
//设置进度条变化的颜色
swipeRefreshLayout.setColorSchemeResources(
R.color.firstColor,
R.color.secondColor,
R.color.thirdColor,
R.color.forthColor);
}
/**
* 初始化界面控件
*/
private void initView() {
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_google_and_loadmore_refresh_layout);
loadMoreListView = (LoadMoreListView) findViewById(R.id.google_and_loadmore_refresh_listview);
loadMoreListView.setOnRefreshListener(this);
}
/**
* 触发了下拉刷新事件,就会执行onRefresh()方法,这样就能在这个
* 方法中去执行网络获取最新的数据,然后再刷新到listview上面
*/
@Override
public void onRefresh() {
//因为本例中没有从网络获取数据,因此这里使用Handler演示4秒延迟来从服务器获取数据的延迟现象,以便于大家
// 能够看到listView正在刷新的状态。大家在现实使用时只需要使用run(){}方法中的代码就行了。
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//获取最新的list数据
setRefreshData();
//通知界面显示,
adapter.notifyDataSetChanged();
// 通知listview刷新数据完毕,让listview停止刷新
swipeRefreshLayout.setRefreshing(false);
}
}, 6000);
}
/**
* 模拟加载刷新数据
*/
private void setRefreshData() {
//这里只是模拟3个列表项数据,在现实开发中,listview中的数据都是从服务器获取的。
for (int i = 0; i < 3; i++) {
ListViewItem item = new ListViewItem();
item.setUserImg(R.mipmap.ic_launcher);
item.setUserName("seven" + i);
item.setUserComment("这是一个下拉刷新,上拉加载更多的ListView");
items.add(item);
}
}
/**
* ”加载更多“ 的回调接口方法
*/
@Override
public void onLoadingMore() {
//因为本例中没有从网络获取数据,因此这里使用Handler演示4秒延迟来从服务器获取数据的延迟现象,以便于大家
// 能够看到listView正在刷新的状态。大家在现实使用时只需要使用run(){}方法中的代码就行了。
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//获取最新的list数据
setRefreshData();
//通知界面显示,
adapter.notifyDataSetChanged();
// 通知listview刷新数据完毕,让listview停止刷新,取消加载跟多
loadMoreListView.loadMoreComplete();
}
}, 6000);
}
}