今天同事提到要做列表的刷新和加载更多我想到现在项目上的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() { //刷新时操作
} });