@wangwangheng
2014-11-24T02:39:45.000000Z
字数 4225
阅读 2106
ListView
目录
package com.culiu.purchase.app.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import com.culiu.core.pulltorefresh.library.PullToRefreshListView;
/**
* 具有倒数第N个Item可见的时候的监听的下拉刷新控件,注意千万别给mRefreshView设置滚动监听,否则这个类就废了
*
* @author wangheng
*
*/
public class CountdownPullToRefreshListView extends PullToRefreshListView {
/** 上一个可见的Item的索引 **/
private int mPreviousItem = 0;
/** 监听器,你懂得 **/
private OnCountdownItemVisibleListener mCountdownListener = null;
public CountdownPullToRefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CountdownPullToRefreshListView(
Context context,
com.culiu.core.pulltorefresh.library.PullToRefreshBase.Mode mode,
com.culiu.core.pulltorefresh.library.PullToRefreshBase.AnimationStyle style) {
super(context, mode, style);
init(context);
}
public CountdownPullToRefreshListView(Context context,
com.culiu.core.pulltorefresh.library.PullToRefreshBase.Mode mode) {
super(context, mode);
init(context);
}
public CountdownPullToRefreshListView(Context context) {
super(context);
init(context);
}
/**
* 初始化View
*
* @param context
*/
private void init(Context context) {
mRefreshableView.setOnScrollListener(new InternalOnScrollListener());
}
/**
*
* @author wangheng
*
*/
private class InternalOnScrollListener implements OnScrollListener {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 回调父类的方法
CountdownPullToRefreshListView.this.onScrollStateChanged(view,
scrollState);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 回调父类的方法
CountdownPullToRefreshListView.this.onScroll(view,
firstVisibleItem, visibleItemCount, totalItemCount);
int lastItem = firstVisibleItem + visibleItemCount;
if (mCountdownListener != null) {
int countdown = mCountdownListener.getCountdownNumber();
// 为什么是大于而不是大于等于?这里取满足条件的的一个临界点,假如有20个Item,倒数第4个的时候调用onVisible,则这个时机在第15个跳转到第16个的一瞬间进行加载
if (lastItem > mPreviousItem && lastItem == totalItemCount - countdown) {
mCountdownListener.onVisible();
}
}
mPreviousItem = lastItem;
}
}
/**
* 设置倒数第N个元素可见的时候的监听器
*
* @param listener
*/
public void setOnCountdownItemVisibleListener(OnCountdownItemVisibleListener listener) {
this.mCountdownListener = listener;
}
/**
* 倒数第几个Item可见的时候刷新舰艇 注意,只有在ListView往上拉的时候,回调方法才会调用
*
* @author wangheng
*
*/
public interface OnCountdownItemVisibleListener {
/**
* 倒数第几个Item的时候刷新数据
*
* @return 实现这个接口的对象需要给定倒数第几个数据开始刷新
*/
int getCountdownNumber();
/**
* 第getCountdownNumber()个Item可见的时候的回调,特别注意这个方法会调用多次,自己要在这个方法中做是否正在刷新的判断
*/
void onVisible();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:culiu="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- <com.culiu.core.pulltorefresh.library.PullToRefreshListView -->
<com.culiu.purchase.app.view.CountdownPullToRefreshListView
android:id="@+id/home99ListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@color/transparent"
android:cacheColorHint="@color/transparent"
android:divider="@color/transparent"
android:dividerHeight="1px"
android:fastScrollEnabled="false"
android:scrollbarStyle="outsideOverlay"
android:fadingEdge="none"
culiu:ptrMode="pullFromStart"
culiu:ptrAnimationStyle="flip"
culiu:ptrHeaderTextColor="@color/ptr_header_text_color"
android:layout_marginTop="-1dip"
/>
</LinearLayout>
/** ListView **/
private CountdownPullToRefreshListView mRefreshView = null;
@Override
protected View onCreateViewExecute(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home99, container, false);
mViewFinder = new ViewFinder(view);
mRefreshView = mViewFinder.find(R.id.home99ListView);
// 为什么实现OnRefreshListener2而不是OnRefreshListener?为了扩展的需要
mRefreshView.setOnRefreshListener(Home99Fragment.this);
mRefreshView.setOnCountdownItemVisibleListener(Home99Fragment.this);
return view;
}
@Override
public int getCountdownNumber() {
// 倒数第四个元素执行刷新操作
return 4;
}
@Override
public void onVisible() {
DebugLog.e("xinye","==============执行了================");
}