[关闭]
@wangwangheng 2014-11-24T02:39:45.000000Z 字数 4225 阅读 2106

基于Android-Pull-To-Refresh做的当用户下拉到倒数第N个Item时候加载数据的控件

ListView


目录


1.继承自PullToRefreshListView

  1. package com.culiu.purchase.app.view;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.widget.AbsListView;
  5. import android.widget.AbsListView.OnScrollListener;
  6. import com.culiu.core.pulltorefresh.library.PullToRefreshListView;
  7. /**
  8. * 具有倒数第N个Item可见的时候的监听的下拉刷新控件,注意千万别给mRefreshView设置滚动监听,否则这个类就废了
  9. *
  10. * @author wangheng
  11. *
  12. */
  13. public class CountdownPullToRefreshListView extends PullToRefreshListView {
  14. /** 上一个可见的Item的索引 **/
  15. private int mPreviousItem = 0;
  16. /** 监听器,你懂得 **/
  17. private OnCountdownItemVisibleListener mCountdownListener = null;
  18. public CountdownPullToRefreshListView(Context context, AttributeSet attrs) {
  19. super(context, attrs);
  20. init(context);
  21. }
  22. public CountdownPullToRefreshListView(
  23. Context context,
  24. com.culiu.core.pulltorefresh.library.PullToRefreshBase.Mode mode,
  25. com.culiu.core.pulltorefresh.library.PullToRefreshBase.AnimationStyle style) {
  26. super(context, mode, style);
  27. init(context);
  28. }
  29. public CountdownPullToRefreshListView(Context context,
  30. com.culiu.core.pulltorefresh.library.PullToRefreshBase.Mode mode) {
  31. super(context, mode);
  32. init(context);
  33. }
  34. public CountdownPullToRefreshListView(Context context) {
  35. super(context);
  36. init(context);
  37. }
  38. /**
  39. * 初始化View
  40. *
  41. * @param context
  42. */
  43. private void init(Context context) {
  44. mRefreshableView.setOnScrollListener(new InternalOnScrollListener());
  45. }
  46. /**
  47. *
  48. * @author wangheng
  49. *
  50. */
  51. private class InternalOnScrollListener implements OnScrollListener {
  52. @Override
  53. public void onScrollStateChanged(AbsListView view, int scrollState) {
  54. // 回调父类的方法
  55. CountdownPullToRefreshListView.this.onScrollStateChanged(view,
  56. scrollState);
  57. }
  58. @Override
  59. public void onScroll(AbsListView view, int firstVisibleItem,
  60. int visibleItemCount, int totalItemCount) {
  61. // 回调父类的方法
  62. CountdownPullToRefreshListView.this.onScroll(view,
  63. firstVisibleItem, visibleItemCount, totalItemCount);
  64. int lastItem = firstVisibleItem + visibleItemCount;
  65. if (mCountdownListener != null) {
  66. int countdown = mCountdownListener.getCountdownNumber();
  67. // 为什么是大于而不是大于等于?这里取满足条件的的一个临界点,假如有20个Item,倒数第4个的时候调用onVisible,则这个时机在第15个跳转到第16个的一瞬间进行加载
  68. if (lastItem > mPreviousItem && lastItem == totalItemCount - countdown) {
  69. mCountdownListener.onVisible();
  70. }
  71. }
  72. mPreviousItem = lastItem;
  73. }
  74. }
  75. /**
  76. * 设置倒数第N个元素可见的时候的监听器
  77. *
  78. * @param listener
  79. */
  80. public void setOnCountdownItemVisibleListener(OnCountdownItemVisibleListener listener) {
  81. this.mCountdownListener = listener;
  82. }
  83. /**
  84. * 倒数第几个Item可见的时候刷新舰艇 注意,只有在ListView往上拉的时候,回调方法才会调用
  85. *
  86. * @author wangheng
  87. *
  88. */
  89. public interface OnCountdownItemVisibleListener {
  90. /**
  91. * 倒数第几个Item的时候刷新数据
  92. *
  93. * @return 实现这个接口的对象需要给定倒数第几个数据开始刷新
  94. */
  95. int getCountdownNumber();
  96. /**
  97. * 第getCountdownNumber()个Item可见的时候的回调,特别注意这个方法会调用多次,自己要在这个方法中做是否正在刷新的判断
  98. */
  99. void onVisible();
  100. }
  101. }

2. 在布局文件中使用

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:culiu="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical" >
  7. <!-- <com.culiu.core.pulltorefresh.library.PullToRefreshListView -->
  8. <com.culiu.purchase.app.view.CountdownPullToRefreshListView
  9. android:id="@+id/home99ListView"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:listSelector="@color/transparent"
  13. android:cacheColorHint="@color/transparent"
  14. android:divider="@color/transparent"
  15. android:dividerHeight="1px"
  16. android:fastScrollEnabled="false"
  17. android:scrollbarStyle="outsideOverlay"
  18. android:fadingEdge="none"
  19. culiu:ptrMode="pullFromStart"
  20. culiu:ptrAnimationStyle="flip"
  21. culiu:ptrHeaderTextColor="@color/ptr_header_text_color"
  22. android:layout_marginTop="-1dip"
  23. />
  24. </LinearLayout>

3. 在代码中使用

  1. /** ListView **/
  2. private CountdownPullToRefreshListView mRefreshView = null;
  3. @Override
  4. protected View onCreateViewExecute(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  5. View view = inflater.inflate(R.layout.fragment_home99, container, false);
  6. mViewFinder = new ViewFinder(view);
  7. mRefreshView = mViewFinder.find(R.id.home99ListView);
  8. // 为什么实现OnRefreshListener2而不是OnRefreshListener?为了扩展的需要
  9. mRefreshView.setOnRefreshListener(Home99Fragment.this);
  10. mRefreshView.setOnCountdownItemVisibleListener(Home99Fragment.this);
  11. return view;
  12. }
  13. @Override
  14. public int getCountdownNumber() {
  15. // 倒数第四个元素执行刷新操作
  16. return 4;
  17. }
  18. @Override
  19. public void onVisible() {
  20. DebugLog.e("xinye","==============执行了================");
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注