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

  1. mRefreshViewImage.setMinimumHeight(50);

  2. mRefreshView.setOnClickListener(new OnClickRefreshListener());

  3. mRefreshOriginalTopPadding = mRefreshView.getPaddingTop();

  4. mRefreshOriginalBottomPadding = mRefreshView.getPaddingBottom();

  5. mRefreshState = TAP_TO_REFRESH;

  6. //        addHeaderView(mRefreshView);

  7. addFooterView(mRefreshView);

  8. super.setOnScrollListener(this);

  9. measureView(mRefreshView);

  10. mRefreshViewHeight = mRefreshView.getMeasuredHeight();

  11. }

  12. @Override

  13. protected void onAttachedToWindow() {

  14. //setSelection(1);

  15. }

  16. @Override

  17. public void setAdapter(ListAdapter adapter) {

  18. super.setAdapter(adapter);

  19. //setSelection(1);

  20. }

  21. /**

  22. * Set the listener that will receive notifications every time the list

  23. * scrolls.

  24. *

  25. * @param l The scroll listener.

  26. */

  27. @Override

  28. public void setOnScrollListener(AbsListView.OnScrollListener l) {

  29. mOnScrollListener = l;

  30. }

  31. /**

  32. * Register a callback to be invoked when this list should be refreshed.

  33. *

  34. * @param onRefreshListener The callback to run.

  35. */

  36. public void setOnRefreshListener(OnRefreshListener onRefreshListener) {

  37. mOnRefreshListener = onRefreshListener;

  38. }

  39. /**

  40. * Set a text to represent when the list was last updated.

  41. * @param lastUpdated Last updated at.

  42. */

  43. public void setLastUpdated(CharSequence lastUpdated) {

  44. if (lastUpdated != null) {

  45. mRefreshViewLastUpdated.setVisibility(View.VISIBLE);

  46. mRefreshViewLastUpdated.setText(lastUpdated);

  47. } else {

  48. mRefreshViewLastUpdated.setVisibility(View.GONE);

  49. }

  50. }

  51. @Override

  52. public boolean onTouchEvent(MotionEvent event) {

  53. final int y = (int) event.getY();

  54. Log.i(“PullToRefreshListView”, “Height:” + getMeasuredHeight());

  55. Log.i(“PullToRefreshListView”, “MotionEvent:” + event.getAction());

  56. Log.i(“PullToRefreshListView”, “mRefreshState:” + mRefreshState);

  57. Log.i(“PullToRefreshListView”, “FirstVisiblePosition:” + getFirstVisiblePosition());

  58. Log.i(“PullToRefreshListView”, “LastVisiblePosition:” + getLastVisiblePosition());

  59. Log.i(“PullToRefreshListView”, “ChildCount:” + getAdapter().getCount());

  60. Log.i(“PullToRefreshListView”, “RefreshViewBottom:” + mRefreshView.getBottom());

  61. Log.i(“PullToRefreshListView”, “RefreshViewTop:” + mRefreshView.getTop());

  62. Log.i(“PullToRefreshListView”, “mRefreshViewHeight:” + mRefreshViewHeight);

  63. Log.i(“PullToRefreshListView”, "  ");

  64. Log.i(“PullToRefreshListView”, "  ");

  65. Log.i(“PullToRefreshListView”, "  ");

  66. switch (event.getAction()) {

  67. case MotionEvent.ACTION_UP:

  68. if (!isVerticalScrollBarEnabled()) {

  69. setVerticalScrollBarEnabled(true);

  70. }

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

  72. && mRefreshState != REFRESHING) {

  73. if ((

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

  75. && mRefreshState == RELEASE_TO_REFRESH) {

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

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

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

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

  80. // Initiate the refresh

  81. mRefreshState = REFRESHING;

  82. prepareForRefresh();

  83. onRefresh();

  84. } else if (

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

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

  87. resetHeader();

  88. //setSelection(1);

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

  90. //                        setSelectionAfterHeaderView();

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

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

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

  94. }

  95. }

  96. break;

  97. case MotionEvent.ACTION_DOWN:

  98. mLastMotionY = y;

  99. break;

  100. case MotionEvent.ACTION_MOVE:

  101. applyHeaderPadding(event);

  102. break;

  103. }

  104. return super.onTouchEvent(event);

  105. }

  106. private void applyHeaderPadding(MotionEvent ev) {

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

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

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

  110. int pointerCount = 1;

  111. try {

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

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

  114. } catch (NoSuchMethodException e) {

  115. pointerCount = 1;

  116. } catch (IllegalArgumentException e) {

  117. throw e;

  118. } catch (IllegalAccessException e) {

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

  120. } catch (InvocationTargetException e) {

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

  122. }

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

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

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

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

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

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

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

  130. if (mRefreshState == RELEASE_TO_REFRESH) {

  131. if (isVerticalFadingEdgeEnabled()) {

  132. setVerticalScrollBarEnabled(false);

  133. }

  134. int historicalY = 0;

  135. try {

  136. // For Android > 2.0

  137. Method method = MotionEvent.class.getMethod(

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

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

  140. } catch (NoSuchMethodException e) {

  141. // For Android < 2.0

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

  143. } catch (IllegalArgumentException e) {

  144. throw e;

  145. } catch (IllegalAccessException e) {

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

  147. } catch (InvocationTargetException e) {

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

  149. }

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

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

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

  153. + mRefreshViewHeight) / 1.7);

  154. mRefreshView.setPadding(

  155. mRefreshView.getPaddingLeft(),

  156. mRefreshView.getPaddingTop(),

  157. mRefreshView.getPaddingRight(),

  158. topPadding);

  159. }

  160. }

  161. }

  162. }

  163. /**

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

  165. */

  166. private void resetHeaderPadding() {

  167. mRefreshView.setPadding(

  168. mRefreshView.getPaddingLeft(),

  169. mRefreshView.getPaddingTop(),

  170. mRefreshView.getPaddingRight(),

  171. mRefreshOriginalBottomPadding);

  172. }

  173. /**

  174. * Resets the header to the original state.

  175. */

  176. private void resetHeader() {

  177. if (mRefreshState != TAP_TO_REFRESH) {

  178. mRefreshState = TAP_TO_REFRESH;

  179. resetHeaderPadding();

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

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

  182. // Replace refresh drawable with arrow drawable

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

  184. // Clear the full rotation animation

  185. mRefreshViewImage.clearAnimation();

  186. // Hide progress bar and arrow.

  187. mRefreshViewImage.setVisibility(View.GONE);

  188. mRefreshViewProgress.setVisibility(View.GONE);

  189. }

  190. }

  191. private void measureView(View child) {

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

  193. if (p == null) {

  194. p = new ViewGroup.LayoutParams(

  195. ViewGroup.LayoutParams.FILL_PARENT,

  196. ViewGroup.LayoutParams.WRAP_CONTENT);

  197. }

  198. int childWidthSpec = ViewGroup.getChildMeasureSpec(0,

  199. 0 + 0, p.width);

  200. int lpHeight = p.height;

  201. int childHeightSpec;

  202. if (lpHeight > 0) {

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

  204. } else {

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

  206. }

  207. child.measure(childWidthSpec, childHeightSpec);

  208. }

  209. @Override

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

  211. int visibleItemCount, int totalItemCount) {

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

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

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

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

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

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

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

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

  220. if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL

  221. && mRefreshState != REFRESHING) {

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

  223. mRefreshViewImage.setVisibility(View.VISIBLE);

  224. if ((

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

  226. && mRefreshState != RELEASE_TO_REFRESH) {

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

  228. mRefreshViewImage.clearAnimation();

  229. mRefreshViewImage.startAnimation(mFlipAnimation);

  230. mRefreshState = RELEASE_TO_REFRESH;

  231. } else if (

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

  233. && mRefreshState != PULL_TO_REFRESH) {

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

  235. if (mRefreshState != TAP_TO_REFRESH) {

  236. mRefreshViewImage.clearAnimation();

  237. mRefreshViewImage.startAnimation(mReverseFlipAnimation);

  238. }

  239. mRefreshState = PULL_TO_REFRESH;

  240. }

  241. } else {

  242. mRefreshViewImage.setVisibility(View.GONE);

  243. resetHeader();

  244. }

  245. } else if (mCurrentScrollState == SCROLL_STATE_FLING

  246. && firstVisibleItem + visibleItemCount == totalItemCount

  247. && mRefreshState != REFRESHING) {

  248. //setSelection(1);

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

  250. setSelection(getSelectedItemPosition() - 2);

  251. //

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

  253. }

  254. if (mOnScrollListener != null) {

  255. mOnScrollListener.onScroll(view, firstVisibleItem,

  256. visibleItemCount, totalItemCount);

  257. }

  258. }

  259. @Override

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

  261. mCurrentScrollState = scrollState;

  262. if (mOnScrollListener != null) {

  263. mOnScrollListener.onScrollStateChanged(view, scrollState);

  264. }

  265. }

  266. public void prepareForRefresh() {

  267. resetHeaderPadding();

  268. mRefreshViewImage.setVisibility(View.GONE);

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

  270. mRefreshViewImage.setImageDrawable(null);

  271. mRefreshViewProgress.setVisibility(View.VISIBLE);

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

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

  274. mRefreshState = REFRESHING;

  275. }

  276. public void onRefresh() {

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

  278. if (mOnRefreshListener != null) {

  279. mOnRefreshListener.onRefresh();

  280. }

  281. }

  282. /**

  283. * Resets the list to a normal state after a refresh.

  284. * @param lastUpdated Last updated at.

  285. */

  286. public void onRefreshComplete(CharSequence lastUpdated) {

  287. setLastUpdated(lastUpdated);

  288. onRefreshComplete();

  289. }

最后

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。

也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。

我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料

部分文件:



《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  1. public void onRefreshComplete(CharSequence lastUpdated) {

  2. setLastUpdated(lastUpdated);

  3. onRefreshComplete();

  4. }

最后

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。

也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。

我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料

部分文件:
[外链图片转存中…(img-97mEhPvD-1714638009072)]
[外链图片转存中…(img-e1k7zyip-1714638009074)]
[外链图片转存中…(img-uudXlWBL-1714638009075)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值