android ListView下拉刷新及上拉加载 (自定义ListView,可直接使用)

今天同事提到要做列表的刷新和加载更多我想到现在项目上的ListView的加载当初为了赶项目直接借鉴别人的Ctrl+C and Ctrl+V做出来的,体验不是很好。所以我就再次查看了原来的代码,并参考后自己写了一个。

ListView是android项目常用到的控件之一,刷新和加载也难倒了很多项我一样的菜鸟。很多人会觉得重写ListView会很麻烦,所以我今天试着写了一个。

列表滑动监听AbsListView.OnScrollListener是一个简单的监听接口,使用非常方便,我就直接上代码了,不罗嗦。

package i.view.com.iview;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;
import android.widget.AbsListView;

/**
 * Created by 郭月森 on 2017/5/10.
 */

public class ScrollListView extends ListView implements AbsListView.OnScrollListener {
    private int last_index;//当前显示的最后一项
    private int total_index;//总项数
    private int firstVisibleItem;//当前显示的第一项
    private View loadmoreView;//加载或刷新布局
    private Context context;
    private boolean isLoading = false;//刷新布局是否在显示状态
    private actingLoadOrRefresh loadorrefresh; //刷新操作接口
    public Handler handler = new Handler(){//取消刷新布局必须在主线程中操作
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //判断布局是否为空
            if (loadmoreView != null) {
                //取消显示刷新view
                loadmoreView.setVisibility(View.GONE);//设置刷新界面不可见
                //修改状态
                isLoading = false;
                //判断是刷新还是加载
                if (msg.what == 0)
                    removeFooterView(loadmoreView);//删除加载布局
                else
                    removeHeaderView(loadmoreView);//删除刷新布局
            }
        }
    };
    public ScrollListView(Context context) {
        super(context);
        this.context = context;
        //添加监听
        setOnScrollListener(this);
    }

    public ScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        setOnScrollListener(this);
    }

    public ScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        setOnScrollListener(this);
    }

    /**
     * 传入操作接口
     * @param loadorrefresh
     */
    public void setLoadorrefresh(actingLoadOrRefresh loadorrefresh) {
        this.loadorrefresh = loadorrefresh;
    }

    /**
     * 修改刷新或加载View
     * @param loadmoreView
     */
    public void setLoadmoreView(View loadmoreView) {
        this.loadmoreView = loadmoreView;
    }

    /**
     *
     * @param view
     * @param scrollState
     */
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(last_index == total_index && (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE))
        {
            onLoad();
        }else if(firstVisibleItem == 0&&(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)){
            onRefresh();
        }
    }

    /**
     *
     * @param view
     * @param firstVisibleItem
     * @param visibleItemCount
     * @param totalItemCount
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        last_index = firstVisibleItem+visibleItemCount;
        total_index = totalItemCount;
        this.firstVisibleItem = firstVisibleItem;

    }
    /**
     * 刷新
     */
    private void onRefresh() {
        //判断刷新view是否为空
        if (loadmoreView == null){
            //自定义的刷新view
            loadmoreView = LayoutInflater.from(context).inflate(R.layout.load_more,null);
            //设置为不显示
            loadmoreView.setVisibility(INVISIBLE);
        }
        //表示此时需要显示刷新视图界面进行新数据的加载(要等滑动停止)以及判断接口是否存在
        if(!isLoading&& loadorrefresh != null)
        {
            //将布局添加到listview中
            this.addHeaderView(loadmoreView,null,false);
            //不处于加载状态的话对其进行加载
            isLoading = true;
            //设置刷新界面可见
            loadmoreView.setVisibility(View.VISIBLE);
            loadorrefresh.Refresh();
        }else {
            //正在刷新货接口不存在时不做任何操作
            return;
        }
    }
    /**
     * 加载
     */
    public void onLoad()
    {
        if (loadmoreView == null){
            loadmoreView = LayoutInflater.from(context).inflate(R.layout.load_more,null);
            loadmoreView.setVisibility(INVISIBLE);
        }

        //表示此时需要显示刷新视图界面进行新数据的加载(要等滑动停止)
        if(!isLoading&& loadorrefresh != null)
        {
            this.addFooterView(loadmoreView,null,false);
            //addHeaderView(loadmoreView);
            //不处于加载状态的话对其进行加载
            isLoading = true;
            //设置刷新界面可见
            loadmoreView.setVisibility(View.VISIBLE);
            loadorrefresh.actingLoad();
        }else {
            return;
        }
    }

    /**
     * 加载完成
     */
    public void loadComplete(boolean or)
    {
        Message message = new Message();
        if (or)
            message.what = 0;
        else
        message.what = 1;
        handler.sendMessage(message);
    }
    public interface actingLoadOrRefresh{
        public void actingLoad();
        public void Refresh();
    }
}
 
 使用方法 

直接在xml中引用

<com.*****.ScrollListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ></com.*****.ScrollListView>
代码中
final ScrollListView listView = (ScrollListView) findViewById(R.id.list);
listView.setLoadorrefresh(new ScrollListView.actingLoadOrRefresh() {
    @Override
    public void actingLoad() {
       //加载时操作
    }

    @Override
    public void Refresh() {
       //刷新时操作
    }
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值