package com.grumoon.androidultrapulltorefreshdemo.view; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.AbsListView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.grumoon.androidultrapulltorefreshdemo.R; import com.nostra13.universalimageloader.core.ImageLoader; public class GetMoreListView extends ListView { // 加载更多接口 public interface OnGetMoreListener { public void onGetMore(); } private static final String TAG = GetMoreListView.class.getSimpleName(); private LayoutInflater inflater; // 加载更多视图(底部视图) private View footView; // 加载更多文字 private TextView tvFootTitle; // 加载更多忙碌框 private ProgressBar pbFootRefreshing; // 是否已经添加了footer private boolean addFooterFlag; // 是否还有数据标志 private boolean hasMoreDataFlag = true; /** * Scroll时到达最后一个Item的次数,只有第一次能触发自动刷新 */ private int reachLastPositionCount = 0; private OnGetMoreListener getMoreListener; private boolean isGetMoreing = false; public GetMoreListView(Context context) { this(context, null); } public GetMoreListView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public GetMoreListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } /** * 初始化 * * @param context */ private void init(Context context, AttributeSet attrs) { inflater = LayoutInflater.from(context); /** * 底部 */ footView = inflater.inflate(R.layout.get_more_list_view_foot, this, false); tvFootTitle = (TextView) footView.findViewById(R.id.tv_foot_title); pbFootRefreshing = (ProgressBar) footView.findViewById(R.id.pb_foot_refreshing); // 滑动监听 setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { doOnScrollStateChanged(view, scrollState); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { doOnScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } }); } // 加载更多 private void getMore() { if (getMoreListener != null) { isGetMoreing = true; pbFootRefreshing.setVisibility(View.VISIBLE); tvFootTitle.setText("正在加载..."); getMoreListener.onGetMore(); } } /** * 判断是否可以自动加载更多<br/> * * @return */ private boolean checkCanAutoGetMore() { if (footView == null) { return false; } if (getMoreListener == null) { return false; } if (isGetMoreing) { return false; } if (!hasMoreDataFlag) { return false; } if (getAdapter() == null) { return false; } if (!canScroll(1) && !canScroll(-1)) { return false; } if (getLastVisiblePosition() != getAdapter().getCount() - 1) { return false; } if (reachLastPositionCount != 1) { return false; } return true; } /** * 判断ListView是否可以滑动 * * @param direction * @return */ private boolean canScroll(int direction) { final int childCount = getChildCount(); if (childCount == 0) { return false; } final int firstPosition = getFirstVisiblePosition(); final int listPaddingTop = getPaddingTop(); final int listPaddingBottom = getPaddingTop(); final int itemCount = getAdapter().getCount(); if (direction > 0) { final int lastBottom = getChildAt(childCount - 1).getBottom(); final int lastPosition = firstPosition + childCount; return lastPosition < itemCount || lastBottom > getHeight() - listPaddingBottom; } else { final int firstTop = getChildAt(0).getTop(); return firstPosition > 0 || firstTop < listPaddingTop; } } /** * 设置加载更多监听器 * * @param getMoreListener */ public void setOnGetMoreListener(OnGetMoreListener getMoreListener) { this.getMoreListener = getMoreListener; if (!addFooterFlag) { addFooterFlag = true; this.addFooterView(footView); } } /** * 加载更多完成 */ public void getMoreComplete() { isGetMoreing = false; pbFootRefreshing.setVisibility(View.GONE); tvFootTitle.setText("加载更多"); } /** * 设置没有更多的数据了<br/> * 不再显示加载更多按钮 */ public void setNoMore() { hasMoreDataFlag = false; if (footView != null) { footView.setVisibility(View.GONE); } } /** * 显示加载更多按钮 */ public void setHasMore() { hasMoreDataFlag = true; if (footView != null) { footView.setVisibility(View.VISIBLE); } } /** * 如果项目中其他地方需要重新设置GetMoreListView的OnScrollListener<br/> * 请在新的listener中onScrollStateChanged方法内调用此方法,保证PullListView正常运行。 * * @param view * @param scrollState */ public void doOnScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: break; case OnScrollListener.SCROLL_STATE_FLING: // 滑动时候停止加载图片 ImageLoader.getInstance().pause(); break; case OnScrollListener.SCROLL_STATE_IDLE: // 停下后恢复加载图片 ImageLoader.getInstance().resume(); break; default: break; } } /** * 如果项目中其他地方需要重新设置GetMoreListView的OnScrollListener<br/> * 请在新的listener中onScroll方法内调用此方法,保证PullListView正常运行。 * * @param view * @param firstVisibleItem * @param visibleItemCount * @param totalItemCount */ public void doOnScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (getAdapter() == null) { return; } if (getLastVisiblePosition() == getAdapter().getCount() - 1) { reachLastPositionCount++; } else { reachLastPositionCount = 0; } if (checkCanAutoGetMore()) { getMore(); } } }