Android中listView的底部拖拉翻页的实现

  1. switch (event.getAction()) {

  2. case MotionEvent.ACTION_UP:

  3. if (!isVerticalScrollBarEnabled()) {

  4. setVerticalScrollBarEnabled(true);

  5. }

  6. if (getLastVisiblePosition() == getAdapter().getCount() - 1

  7. && mRefreshState != REFRESHING) {

  8. if ((

  9. mRefreshView.getTop() <= getMeasuredHeight() - mRefreshViewHeight)

  10. && mRefreshState == RELEASE_TO_REFRESH) {

  11. //                        Log.i(“PullToRefreshListView”, “Fire…”);

  12. //                        Log.i(“PullToRefreshListView”, "  ");

  13. //                        Log.i(“PullToRefreshListView”, "  ");

  14. //                        Log.i(“PullToRefreshListView”, "  ");

  15. // Initiate the refresh

  16. mRefreshState = REFRESHING;

  17. prepareForRefresh();

  18. onRefresh();

  19. } else if (

  20. mRefreshView.getTop() > getMeasuredHeight() - mRefreshViewHeight) {

  21. // Abort refresh and scroll down below the refresh view

  22. resetHeader();

  23. //setSelection(1);

  24. //                        Log.v(“PPMacbook”, “pi:” + (getSelectedItemPosition() - 1));

  25. //                        setSelectionAfterHeaderView();

  26. //                        setSelection(getSelectedItemPosition() - 1);

  27. //                        System.out.println(“PPMacbook:” + (getFirstVisiblePosition() - 1));

  28. setSelection((getFirstVisiblePosition() - 1));

  29. }

  30. }

  31. break;

  32. case MotionEvent.ACTION_DOWN:

  33. mLastMotionY = y;

  34. break;

  35. case MotionEvent.ACTION_MOVE:

  36. applyHeaderPadding(event);

  37. break;

  38. }

  39. return super.onTouchEvent(event);

  40. }

  41. private void applyHeaderPadding(MotionEvent ev) {

  42. final int historySize = ev.getHistorySize();

  43. // Workaround for getPointerCount() which is unavailable in 1.5

  44. // (it’s always 1 in 1.5)

  45. int pointerCount = 1;

  46. try {

  47. Method method = MotionEvent.class.getMethod(“getPointerCount”);

  48. pointerCount = (Integer)method.invoke(ev);

  49. } catch (NoSuchMethodException e) {

  50. pointerCount = 1;

  51. } catch (IllegalArgumentException e) {

  52. throw e;

  53. } catch (IllegalAccessException e) {

  54. System.err.println("unexpected " + e);

  55. } catch (InvocationTargetException e) {

  56. System.err.println("unexpected " + e);

  57. }

  58. //        Log.i(“PullToRefreshListView”, “historySize:” + historySize);

  59. //        Log.i(“PullToRefreshListView”, “pointerCount:” + pointerCount);

  60. //        Log.i(“PullToRefreshListView”, "  ");

  61. //        Log.i(“PullToRefreshListView”, "  ");

  62. //        Log.i(“PullToRefreshListView”, "  ");

  63. for (int h = 0; h < historySize; h++) {

  64. for (int p = 0; p < pointerCount; p++) {

  65. if (mRefreshState == RELEASE_TO_REFRESH) {

  66. if (isVerticalFadingEdgeEnabled()) {

  67. setVerticalScrollBarEnabled(false);

  68. }

  69. int historicalY = 0;

  70. try {

  71. // For Android > 2.0

  72. Method method = MotionEvent.class.getMethod(

  73. “getHistoricalY”, Integer.TYPE, Integer.TYPE);

  74. historicalY = ((Float) method.invoke(ev, p, h)).intValue();

  75. } catch (NoSuchMethodException e) {

  76. // For Android < 2.0

  77. historicalY = (int) (ev.getHistoricalY(h));

  78. } catch (IllegalArgumentException e) {

  79. throw e;

  80. } catch (IllegalAccessException e) {

  81. System.err.println("unexpected " + e);

  82. } catch (InvocationTargetException e) {

  83. System.err.println("unexpected " + e);

  84. }

  85. // Calculate the padding to apply, we divide by 1.7 to

  86. // simulate a more resistant effect during pull.

  87. int topPadding = (int) (((historicalY + mLastMotionY)

  88. + mRefreshViewHeight) / 1.7);

  89. mRefreshView.setPadding(

  90. mRefreshView.getPaddingLeft(),

  91. mRefreshView.getPaddingTop(),

  92. mRefreshView.getPaddingRight(),

  93. topPadding);

  94. }

  95. }

  96. }

  97. }

  98. /**

  99. * Sets the header padding back to original size.

  100. */

  101. private void resetHeaderPadding() {

  102. mRefreshView.setPadding(

  103. mRefreshView.getPaddingLeft(),

  104. mRefreshView.getPaddingTop(),

  105. mRefreshView.getPaddingRight(),

  106. mRefreshOriginalBottomPadding);

  107. }

  108. /**

  109. * Resets the header to the original state.

  110. */

  111. private void resetHeader() {

  112. if (mRefreshState != TAP_TO_REFRESH) {

  113. mRefreshState = TAP_TO_REFRESH;

  114. resetHeaderPadding();

  115. // Set refresh view text to the pull label

  116. mRefreshViewText.setText(R.string.pull_to_refresh_tap_label);

  117. // Replace refresh drawable with arrow drawable

  118. mRefreshViewImage.setImageResource(R.drawable.ic_pulltorefresh_arrow);

  119. // Clear the full rotation animation

  120. mRefreshViewImage.clearAnimation();

  121. // Hide progress bar and arrow.

  122. mRefreshViewImage.setVisibility(View.GONE);

  123. mRefreshViewProgress.setVisibility(View.GONE);

  124. }

  125. }

  126. private void measureView(View child) {

  127. ViewGroup.LayoutParams p = child.getLayoutParams();

  128. if (p == null) {

  129. p = new ViewGroup.LayoutParams(

  130. ViewGroup.LayoutParams.FILL_PARENT,

  131. ViewGroup.LayoutParams.WRAP_CONTENT);

  132. }

  133. int childWidthSpec = ViewGroup.getChildMeasureSpec(0,

  134. 0 + 0, p.width);

  135. int lpHeight = p.height;

  136. int childHeightSpec;

  137. if (lpHeight > 0) {

  138. childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);

  139. } else {

  140. childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);

  141. }

  142. child.measure(childWidthSpec, childHeightSpec);

  143. }

  144. @Override

  145. public void onScroll(AbsListView view, int firstVisibleItem,

  146. int visibleItemCount, int totalItemCount) {

  147. //        Log.i(“PullToRefreshListView”, “firstVisibleItem:” + firstVisibleItem);

  148. //        Log.i(“PullToRefreshListView”, “visibleItemCount:” + visibleItemCount);

  149. //        Log.i(“PullToRefreshListView”, “totalItemCount:” + totalItemCount);

  150. //        Log.i(“PullToRefreshListView”, “”);

  151. //        Log.i(“PullToRefreshListView”, “”);

  152. //        Log.i(“PullToRefreshListView”, “”);

  153. // When the refresh view is completely visible, change the text to say

  154. // “Release to refresh…” and flip the arrow drawable.

  155. if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL

  156. && mRefreshState != REFRESHING) {

  157. if (firstVisibleItem + visibleItemCount == totalItemCount) {

  158. mRefreshViewImage.setVisibility(View.VISIBLE);

  159. if ((

  160. mRefreshView.getTop() <= getMeasuredHeight() - mRefreshViewHeight)

  161. && mRefreshState != RELEASE_TO_REFRESH) {

  162. mRefreshViewText.setText(R.string.pull_to_refresh_release_label);

  163. mRefreshViewImage.clearAnimation();

  164. mRefreshViewImage.startAnimation(mFlipAnimation);

  165. mRefreshState = RELEASE_TO_REFRESH;

  166. } else if (

  167. mRefreshView.getTop() >getMeasuredHeight() - 20 - mRefreshViewHeight

  168. && mRefreshState != PULL_TO_REFRESH) {

  169. mRefreshViewText.setText(R.string.pull_to_refresh_pull_label);

  170. if (mRefreshState != TAP_TO_REFRESH) {

  171. mRefreshViewImage.clearAnimation();

  172. mRefreshViewImage.startAnimation(mReverseFlipAnimation);

  173. }

  174. mRefreshState = PULL_TO_REFRESH;

  175. }

  176. } else {

  177. mRefreshViewImage.setVisibility(View.GONE);

  178. resetHeader();

  179. }

  180. } else if (mCurrentScrollState == SCROLL_STATE_FLING

  181. && firstVisibleItem + visibleItemCount == totalItemCount

  182. && mRefreshState != REFRESHING) {

  183. //setSelection(1);

  184. //            Log.i(“PullToRefreshListView”, “Selection:” + (totalItemCount - visibleItemCount));

  185. setSelection(getSelectedItemPosition() - 2);

  186. //

  187. setSelection((getFirstVisiblePosition() - 1));

  188. }

  189. if (mOnScrollListener != null) {

  190. mOnScrollListener.onScroll(view, firstVisibleItem,

  191. visibleItemCount, totalItemCount);

  192. }

  193. }

  194. @Override

  195. public void onScrollStateChanged(AbsListView view, int scrollState) {

  196. mCurrentScrollState = scrollState;

  197. if (mOnScrollListener != null) {

  198. mOnScrollListener.onScrollStateChanged(view, scrollState);

  199. }

  200. }

  201. public void prepareForRefresh() {

  202. resetHeaderPadding();

  203. mRefreshViewImage.setVisibility(View.GONE);

  204. // We need this hack, otherwise it will keep the previous drawable.

  205. mRefreshViewImage.setImageDrawable(null);

  206. mRefreshViewProgress.setVisibility(View.VISIBLE);

  207. // Set refresh view text to the refreshing label

  208. mRefreshViewText.setText(R.string.pull_to_refresh_refreshing_label);

  209. mRefreshState = REFRESHING;

  210. }

  211. public void onRefresh() {

  212. Log.d(TAG, “onRefresh”);

  213. if (mOnRefreshListener != null) {

  214. mOnRefreshListener.onRefresh();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Android架构视频+BAT面试专题PDF+学习笔记​》

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望**这份系统化的技术体系**对大家有一个方向参考。

哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;**

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Android架构视频+BAT面试专题PDF+学习笔记​》

[外链图片转存中…(img-SXR10qZN-1710507158584)]

[外链图片转存中…(img-OQiMHU3B-1710507158584)]

[外链图片转存中…(img-yW2J7REV-1710507158585)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望**这份系统化的技术体系**对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值