现在很多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); } }