国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android ListView實現上拉加載更多和下拉刷新功能

2019-12-12 06:23:37
字體:
來源:轉載
供稿:網友

本文實例為大家介紹了Android ListView下拉刷新功能的實現方法和功能,供大家參考,具體內容如下

1、ListView優化方式

界面緩存ViewHolder+convertView
分頁加載:上拉刷新
圖片緩存
快速滑動ListView禁止刷新

2、效果

3、上拉加載更多原理及實現

當我們手指滑動到listview最后位置的時候,我們觸發加載數據的方法。這觸發之前我們需要做一些工作,包括:

如何判斷滑動到最后?

如何避免重復加載數據?

加載之后如何刷新界面?

1)、界面實現AbsListView.OnScrollListener接口,當firstVisibleItem + visibleItemCount >= totalItemCount即可判斷滑動到了最下面;
2)、為了不重復加載數據,例如當我手指滑動到最下面,手指立馬離開,然后再馬上滑動,就會導致數據拉取兩次,我們利用mHandler.hasMessages(LOAD)判斷消息隊列中是否已經存在這個消息;
3)、我們在handler中加載新數據,并且利用 mStringArrayAdapter.notifyDataSetChanged();通知界面刷新。

 int result1; int result2; //監聽狀態改變 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case SCROLL_STATE_IDLE: //滑動結束 break; case SCROLL_STATE_FLING: //手指離開屏幕 if (result1 >= result2) {  //只發送一次,防止多次加載數據  if (!mHandler.hasMessages(LOAD))  mHandler.sendEmptyMessageDelayed(LOAD, 5000); } break; case SCROLL_STATE_TOUCH_SCROLL: //滑動中 break; } } //滑動結束之后執行 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // Log.e(TAG, "firstVisibleItem:" + firstVisibleItem + "---visibleItemCount:" + visibleItemCount + "--totalItemCount:" + totalItemCount); //加載到最后 if (firstVisibleItem + visibleItemCount >= totalItemCount) { //這里不處理,在上面狀態改變結束之后再處理 } }

4、下拉加刷新原理及實現

下拉刷新核心原理和上拉加載核心原理一致,只是有細節不同。我們需要處理以下問題:如何判斷用戶當前位置在數據第一條?如何判斷用戶在第一條的同時下拉一定距離?如何刷新更新界面(上面已經解決)?

1)、注意事項:

初始化應該設置默認上面的刷新圖標隱藏,在ProgressBar中設置Android:visibility="gone";這樣設置還不行,還需要設置 mListView.setSelection(1);讓當前第一列是第一條數據。同樣的,在加載完成之后也要設置mListView.setSelection(1);,顯示第一行。

2)、實現

*判斷第一條的方式mListView.getFirstVisiblePosition()==0
*mListView實現 mListView.setOnTouchListener方法,來根據用戶手指按下的位置以及抬起的位置,計算這兩者的距離與我們規定的距離(如100)的大小,如大于就進行刷新操作。
*刷新之后通知界面mStringArrayAdapter.notifyDataSetChanged();

 mListView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) {  case MotionEvent.ACTION_DOWN:  startY=event.getY();  break;  case MotionEvent.ACTION_MOVE:  break;  case MotionEvent.ACTION_UP:  endY=event.getY();  if(endY-startY> DISTANT&&(mListView.getFirstVisiblePosition()==1||mListView.getFirstVisiblePosition()==0)){  if(!mHandler.hasMessages(FRESH)){  mProgressBar_top.setVisibility(View.VISIBLE);  //notif  mHandler.sendEmptyMessageDelayed(FRESH,5000);  }  }  break; } //不能返回true,不然直接消費掉了 return false; } });

以上就是本文的全部內容,希望對大家學習Android軟件編程有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彝良县| 泗水县| 博罗县| 涟源市| 乌苏市| 青田县| 平遥县| 托克逊县| 鄂托克旗| 石台县| 花莲县| 库伦旗| 大关县| 东阿县| 桂东县| 福贡县| 渭源县| 潼关县| 万山特区| 四会市| 盐山县| 米脂县| 仙游县| 勐海县| 阿拉善左旗| 普定县| 京山县| 津市市| 全南县| 饶阳县| 三河市| 湾仔区| 孟连| 曲靖市| 泾川县| 南溪县| 滁州市| 汉阴县| 裕民县| 泊头市| 青阳县|