Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ListView實現上拉加載更多和下拉刷新功能

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

編輯:關於Android編程

本文實例為大家介紹了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軟件編程有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved