您的位置:首页 > 移动开发 > Android开发

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

2017-05-10 16:47 447 查看
今天同事提到要做列表的刷新和加载更多我想到现在项目上的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.*****.ScrollListViewandroid: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() {@Overridepublic void actingLoad() {//加载时操作}@Overridepublic void Refresh() { //刷新时操作
    }});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐