google官方的下拉刷新+自定义上拉加载更多

现在很多app都是使用的自定义的下拉刷新上拉加载更多,然而google官方为我们提供了下拉刷新操作,我在之前的博客中有撰文针对google官方为我们提供了下拉刷新,我们自己增加自定义的上拉加载更多,这样相互结合使用,就出现了一款新的下拉刷新和上拉加载更多的组件,非常推荐在app中增加这中效果。
自定义下拉刷新及上拉加载更多

google官方的下拉刷新+自定义上拉加载更多

(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);  
    }  
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值