1、知识点
1、 onScrollStateChanged
@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}
scrollState有三种状态:
- SCROLL_STATE_TOUCH_SCROLL:开始滚动的时候调用,调用一次
- SCROLL_STATE_IDLE:滚动事件结束的时候调用,调用一次
- SCROLL_STATE_FLING:当手指离开屏幕,并且产生惯性滑动的时候调用,可能会调用<=1次
在没有做出抛的动作时,只会回调两次
2、 onScroll
@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
在滑动屏幕的过程中,onScroll方法会一直调用:
- firstVisibleItem: 当前屏幕显示的第一个item的位置(下标从0开始)
- visibleItemCount:当前屏幕可以见到的item总数,包括没有完整显示的item
- totalItemCount:Item的总数,** 包括通过addFooterView添加的那个item **
** 注意:
在listview的item发生变化的时候(初始化/notifyDataSetChanged()),onScroll会被调用:
初始化listview的时候,onScroll发生调用
**
2、 加载更多
在onScroll这个方法中,可以通过以上几个参数,判断是否是最后一个item,可以实现加载更多的功能
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem+visibleItemCount>=totalItemCount && totalItemCount>0){
isLastRow=true;
}else {
isLastRow=false;
}
}
** ListView的上拉下拉的功能可以通过SwipeRefreshLayout+自定义ListView(OnScrollListener)实现 **,
见,SwipeRefreshLayout的学习
代码如下:
package com.liyi.loadmorelistview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.TextView;
public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {
private Context context;
private View footerView;
private boolean isLastRow;
private boolean isLoading;
private boolean isError;
private OnLoadMoreListener loadMoreListener;
public void setOnLoadMoreListener(OnLoadMoreListener loadMoreListener){
this.loadMoreListener=loadMoreListener;
}
public interface OnLoadMoreListener{
void loadMore();
}
public LoadMoreListView(Context context) {
this(context,null);
}
public LoadMoreListView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public LoadMoreListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context=context;
init();
}
private void init() {
footerView= LayoutInflater.from(context).inflate(R.layout.layout_footer,this,false);
this.addFooterView(footerView);
( (footerView.findViewById(R.id.footerTextView))).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isError){
showLoading("正在加载");
isLoading=true;
loadMoreListener.loadMore();
isError=false;
}
}
});
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("loadMore","onScrollStateChanged:"+scrollState+",isLastRow"+isLastRow);
if(scrollState==SCROLL_STATE_IDLE){
if(isLastRow && !isLoading){
showLoading("正在加载");
isLoading=true;
loadMoreListener.loadMore();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
Log.i("loadMore","onScroll"+"firstVisibleItem:"+firstVisibleItem+",visibleItemCount:"+visibleItemCount+",totalItemCount:"+totalItemCount);
if(firstVisibleItem+visibleItemCount>=totalItemCount && totalItemCount>0){
isLastRow=true;
}else {
isLastRow=false;
}
}
private void showLoading(String msg) {
footerView.findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
((TextView) (footerView.findViewById(R.id.footerTextView))) .setText(msg);
}
private void hiddenLoading(String msg) {
footerView.findViewById(R.id.progressBar).setVisibility(View.GONE);
((TextView) (footerView.findViewById(R.id.footerTextView))) .setText(msg);
}
public void loadComplete(){
Log.i("loadMore","loadComplete"+",isLastRow"+isLastRow);
isError=false;
isLoading=false;
isLastRow=false;
hiddenLoading("-- end --");
}
public void loadError(){
isLoading=false;
isError=true;
hiddenLoading("加载失败,点击重新加载");
}
}
正在 加载
加载失败
没有数据了
网友评论