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() { //刷新时操作
}});
相关文章推荐
- 自定义下拉刷新和上拉加载更多ListView 拷贝可直接使用
- Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向
- 使用SwipeRefreshLayout和自定义listview实现下拉刷新上啦加载更多
- Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView
- 自定义listview下拉刷新上拉加载更多以及与google官方的下拉刷新结合使用
- Android 自定义ListView 实现下拉刷新 上拉加载功能
- android 自定义ListView实现下拉刷新、分页加载、点击事件——自定义控件学习(七)
- android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多
- android 开发笔记 自定义可下拉刷新上拉加载的ListView
- Android实现异步从网络加载图片列表和上拉加载更多、下拉刷新列表(使用xListView框架实现)
- Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向 推荐
- Android UI--自定义ListView(实现下拉刷新+加载更多)
- Android UI--自定义ListView(实现下拉刷新+加载更多)
- android使用SwipeRefreshLayout实现ListView下拉刷新上拉加载
- Android自定义PullListView下拉刷新,上拉加载更多分页数据
- Android 自定义下拉刷新上拉加载更多Listview
- android下拉刷新和滑动到底部加载更多,自定义listview
- Android UI--自定义ListView(实现下拉刷新+加载更多)
- Android 自定义下拉刷新上拉加载更多Listview
- Android UI自定义ListView实现下拉刷新和加载更多效果