亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發之ListView列表刷新和加載更多實現方法

2020-04-11 11:29:27
字體:
來源:轉載
供稿:網友

本文實例講述了Android開發之ListView列表刷新和加載更多實現方法。分享給大家供大家參考。具體如下:

上下拉實現刷新和加載更多的ListView,如下:

package com.sin.android.ui; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; /**  * 動態刷新和加載數據ListView  * @author RobinTang  *  */ public class DynamicListView extends ListView implements OnScrollListener {   /**    * 監聽器    * 監聽控件的刷新或者加載更多事件    * 所有的條目事件都會有一個偏移量,也就是position應該減1才是你適配器中的條目    * @author RobinTang    *    */   public interface DynamicListViewListener {     /**      *      * @param dynamicListView      * @param isRefresh 為true的時候代表的是刷新,為false的時候代表的是加載更多      * @return true:刷新或者加載更多動作完成,刷新或者加載更多的動畫自動消失 false:刷新或者加載更多為完成,需要在數據加載完成之后去調用控件的doneRefresh()或者doneMore()方法      */     public boolean onRefreshOrMore(DynamicListView dynamicListView, boolean isRefresh);   }   /**    * 狀態控件(StatusView,列表頭上和底端的)的狀態枚舉    * @author RobinTang    *    */   enum RefreshStatus {     none, normal, willrefresh, refreshing   }   /**    * 狀態控件    * @author RobinTang    *    */   class StatusView extends LinearLayout {     public int height;     public int width;     private ProgressBar progressBar = null;     private TextView textView = null;     private RefreshStatus refreshStatus = RefreshStatus.none;     private String normalString = "下拉刷新";     private String willrefreshString = "松開刷新";     private String refreshingString = "正在刷新";     public StatusView(Context context, AttributeSet attrs) {       super(context, attrs);       initThis(context);     }     public StatusView(Context context) {       super(context);       initThis(context);     }     private void initThis(Context context) {       this.setOrientation(LinearLayout.HORIZONTAL);       this.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);       progressBar = new ProgressBar(context);       progressBar.setLayoutParams(new LinearLayout.LayoutParams(30, 30));       textView = new TextView(context);       textView.setPadding(5, 0, 0, 0);       this.addView(progressBar);       this.addView(textView);       int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);       int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);       this.measure(w, h);       height = this.getMeasuredHeight();       width = this.getMeasuredWidth();       this.setRefreshStatus(RefreshStatus.normal);     }     public RefreshStatus getRefreshStatus() {       return refreshStatus;     }     public void setRefreshStatus(RefreshStatus refreshStatus) {       if (this.refreshStatus != refreshStatus) {         this.refreshStatus = refreshStatus;         if(refreshStatus == RefreshStatus.refreshing){           this.progressBar.setVisibility(View.VISIBLE);         }         else{           this.progressBar.setVisibility(View.GONE);         }         refreshStatusString();         this.invalidate();       }     }     private void refreshStatusString() {       switch (refreshStatus) {       case normal:         textView.setText(normalString);         progressBar.setProgress(0);         break;       case willrefresh:         textView.setText(willrefreshString);         break;       case refreshing:         textView.setText(refreshingString);         break;       default:         break;       }     }     /**      * 設置狀態字符串      * @param normalString 平時的字符串      * @param willrefreshString 松開后刷新(或加載)的字符串      * @param refreshingString 正在刷新(或加載)的字符串      */     public void setStatusStrings(String normalString, String willrefreshString, String refreshingString){       this.normalString = normalString;       this.willrefreshString = willrefreshString;       this.refreshingString = refreshingString;       this.refreshStatusString();     }   }   private StatusView refreshView;   private StatusView moreView;   private int itemFlag = -1;   private boolean isRecorded = false;   private int downY = -1;   private final float minTimesToRefresh = 1.5f;   private final static int ITEM_FLAG_FIRST = 1;   private final static int ITEM_FLAG_NONE = 0;   private final static int ITEM_FLAG_LAST = -1;   // 兩個監聽器   private DynamicListViewListener onRefreshListener;   private DynamicListViewListener onMoreListener;   // 滾動到低端的時候是否自動加載更多   private boolean doMoreWhenBottom = false;   public DynamicListView(Context context, AttributeSet attrs, int defStyle) {     super(context, attrs, defStyle);     initThis(context);   }   public DynamicListView(Context context, AttributeSet attrs) {     super(context, attrs);     initThis(context);   }   public DynamicListView(Context context) {     super(context);     initThis(context);   }   private void initThis(Context context) {     refreshView = new StatusView(context);     moreView = new StatusView(context);     refreshView.setStatusStrings("繼續下拉刷新數據...", "松開之后刷新數據...", "正在刷新數據...");     moreView.setStatusStrings("繼續上拉加載數據...", "松開之后加載數據...", "正在加載數據...");     this.addHeaderView(refreshView, null, false);     this.addFooterView(moreView, null, false);     this.setOnScrollListener(this);     doneRefresh();     doneMore();   }   // 監聽器操作   public DynamicListViewListener getOnRefreshListener() {     return onRefreshListener;   }   public void setOnRefreshListener(DynamicListViewListener onRefreshListener) {     this.onRefreshListener = onRefreshListener;   }   public DynamicListViewListener getOnMoreListener() {     return onMoreListener;   }   public void setOnMoreListener(DynamicListViewListener onMoreListener) {     this.onMoreListener = onMoreListener;   }   // 設置   public boolean isDoMoreWhenBottom() {     return doMoreWhenBottom;   }   public void setDoMoreWhenBottom(boolean doMoreWhenBottom) {     this.doMoreWhenBottom = doMoreWhenBottom;   }   @Override   public void onScroll(AbsListView l, int t, int oldl, int count) {     // log("%d %d %d", t, oldl, count);     if (t == 0)       itemFlag = ITEM_FLAG_FIRST;     else if ((t + oldl) == count){       itemFlag = ITEM_FLAG_LAST;       if(doMoreWhenBottom && onMoreListener != null && moreView.getRefreshStatus() != RefreshStatus.refreshing){           doMore();       }     }     else {       itemFlag = ITEM_FLAG_NONE; //     isRecorded = false;     }   }   @Override   public void onScrollStateChanged(AbsListView arg0, int arg1) {   }   @Override   public boolean onTouchEvent(MotionEvent ev) {     switch (ev.getAction()) {     case MotionEvent.ACTION_DOWN:       if (isRecorded == false && (itemFlag == ITEM_FLAG_FIRST && onRefreshListener != null && refreshView.getRefreshStatus() == RefreshStatus.normal || itemFlag == ITEM_FLAG_LAST && onMoreListener != null && moreView.getRefreshStatus() == RefreshStatus.normal)) {         downY = (int) ev.getY(0);         isRecorded = true; //       log("按下,記錄:%d flag:%d", downY, itemFlag);       }       break;     case MotionEvent.ACTION_UP: {       isRecorded = false;       if (onRefreshListener != null && refreshView.getRefreshStatus() == RefreshStatus.willrefresh) {         doRefresh();       } else if (refreshView.getRefreshStatus() == RefreshStatus.normal) {         refreshView.setPadding(0, -1 * refreshView.height, 0, 0);       }       if (onMoreListener != null && moreView.getRefreshStatus() == RefreshStatus.willrefresh) {         doMore();       } else if (moreView.getRefreshStatus() == RefreshStatus.normal) {         moreView.setPadding(0, 0, 0, -1 * moreView.height);       }       break;     }     case MotionEvent.ACTION_MOVE: {       if (isRecorded == false && (itemFlag == ITEM_FLAG_FIRST && onRefreshListener != null && refreshView.getRefreshStatus() == RefreshStatus.normal ||            itemFlag == ITEM_FLAG_LAST && onMoreListener != null && moreView.getRefreshStatus() == RefreshStatus.normal)) {         downY = (int) ev.getY(0);         isRecorded = true; //       log("按下,記錄:%d flag:%d", downY, itemFlag);       } else if (isRecorded) {         int nowY = (int) ev.getY(0);         int offset = nowY - downY;         if (offset > 0 && itemFlag == ITEM_FLAG_FIRST) {           // 下拉           setSelection(0);           if (offset >= (minTimesToRefresh * refreshView.height)) {             refreshView.setRefreshStatus(RefreshStatus.willrefresh);           } else {             refreshView.setRefreshStatus(RefreshStatus.normal);           }           refreshView.setPadding(0, -1 * (refreshView.height - offset), 0, 0);         } else if(itemFlag == ITEM_FLAG_LAST){           // 上拉           setSelection(this.getCount());           if (offset <= -1 * (minTimesToRefresh * moreView.height)) {             moreView.setRefreshStatus(RefreshStatus.willrefresh);           } else {             moreView.setRefreshStatus(RefreshStatus.normal);          }           moreView.setPadding(0, 0, 0, -1 * (moreView.height + offset));        } //       log("位移:%d", offset);       }       break;     }     default:       break;     }     return super.onTouchEvent(ev);   }   /**    * 開始刷新    */   private void doRefresh(){ //   log("開始刷新");     refreshView.setRefreshStatus(RefreshStatus.refreshing);     refreshView.setPadding(0, 0, 0, 0);     if(onRefreshListener.onRefreshOrMore(this, true))       doneRefresh();   }   /**    * 開始加載更多    */   private void doMore(){ //   log("加載更多");     moreView.setRefreshStatus(RefreshStatus.refreshing);     moreView.setPadding(0, 0, 0, 0);     if(onMoreListener.onRefreshOrMore(this, false))       doneMore();   }   /**    * 刷新完成之后調用,用于取消刷新的動畫    */   public void doneRefresh() { //   log("刷新完成!");     refreshView.setRefreshStatus(RefreshStatus.normal);     refreshView.setPadding(0, -1 * refreshView.height, 0, 0);   }   /**    * 加載更多完成之后調用,用于取消加載更多的動畫    */   public void doneMore() { //   log("加載完成!");     moreView.setRefreshStatus(RefreshStatus.normal);     moreView.setPadding(0, 0, 0, -1 * moreView.height);   }   /**    * 獲取刷新的狀態    * @return 一般 將要刷新 刷新完成    */   public RefreshStatus getRefreshStatus(){     return refreshView.getRefreshStatus();   }   /**    * 獲取加載更多的狀態    * @return 一般 將要加載 加載完成    */   public RefreshStatus getMoreStatus(){     return moreView.getRefreshStatus();   } // private void log(Object obj) { //   log("%s", obj.toString()); // } // // private void log(String format, Object... args) { //   Log.i("DynamicListView", String.format(format, args)); // } } 

使用例子:

package com.sin.android.ui; import java.util.ArrayList; import java.util.Date; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Toast; import com.sin.android.ui.DynamicListView.DynamicListViewListener; @SuppressLint("HandlerLeak") public class MainActivity extends Activity implements DynamicListViewListener {   DynamicListView listView;   ArrayList<String> data;   ArrayAdapter<String> adapter;   // 用于刷新控件狀態   Handler handler = new Handler() {     @Override     public void handleMessage(Message msg) {       if (msg.what == 0) {         adapter.notifyDataSetChanged();         listView.doneRefresh();         Toast.makeText(MainActivity.this, "新加載"+msg.arg1+"條數據!", Toast.LENGTH_LONG).show();       } else if (msg.what == 1) {         adapter.notifyDataSetChanged();         listView.doneMore();       } else {         super.handleMessage(msg);       }     }   };   @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     listView = new DynamicListView(this);     setContentView(listView);     data = new ArrayList<String>();     for (int i = 1; i < 10; ++i) {       data.add("原始數據" + i);     }     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, data);     listView.setAdapter(adapter);     listView.setOnItemClickListener(new OnItemClickListener() {       @Override       public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {         Log.i("",data.get(arg2-1));       }     });     listView.setDoMoreWhenBottom(false);  // 滾動到低端的時候不自己加載更多     listView.setOnRefreshListener(this);     listView.setOnMoreListener(this);   }   @Override   public boolean onRefreshOrMore(DynamicListView dynamicListView, boolean isRefresh) {     if (isRefresh) {       new Thread(new Runnable() {         @Override         public void run() {           // 刷新           ArrayList<String> temp = new ArrayList<String>();           for (int i = 0; i < 3; ++i) {             temp.add(0, new Date().toLocaleString());             try {               Thread.sleep(1000);             } catch (InterruptedException e) {               e.printStackTrace();             }           }           synchronized (data) {             data.addAll(0, temp);           }           Message message = new Message();           message.what = 0;           message.arg1 = temp.size();           handler.sendMessage(message);         }       }).start();     } else {       new Thread(new Runnable() {         @Override         public void run() {           // 加載更多           ArrayList<String> temp = new ArrayList<String>();           for (int i = 0; i < 3; ++i) {             temp.add(new Date().toLocaleString());             try {               Thread.sleep(1000);             } catch (InterruptedException e) {               e.printStackTrace();             }           }           synchronized (data) {             data.addAll(temp);           }           handler.sendEmptyMessage(1);         }       }).start();     }     return false;   } } 

運行截圖如下:

希望本文所述對大家的Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区二区三区香蕉精| 国产97免费视| 91精品国产综合久久香蕉最新版| 欧美日韩午夜激情| 欧美精品久久久久a| 国产精品丝袜久久久久久不卡| 精品福利视频导航| 亚洲精品综合久久中文字幕| 国产精品av免费在线观看| 亚洲男人av在线| 国产精品亚洲аv天堂网| 久久99国产精品久久久久久久久| 国产精品香蕉av| 曰本色欧美视频在线| 午夜精品一区二区三区在线视频| 国产成人+综合亚洲+天堂| 久久6免费高清热精品| 97成人精品视频在线观看| 国产成人jvid在线播放| 国产精品中文字幕在线观看| 久久九九精品99国产精品| 操日韩av在线电影| 亚洲一区精品电影| 91在线视频九色| 国产美女久久久| 一本一本久久a久久精品牛牛影视| 美女久久久久久久久久久| 欧美大奶子在线| 久久久久久久久久婷婷| 日韩电影中文 亚洲精品乱码| 在线日韩日本国产亚洲| 亚洲无av在线中文字幕| 中文字幕亚洲自拍| 高清视频欧美一级| 亚洲一区999| 尤物九九久久国产精品的分类| 欧美俄罗斯乱妇| 欧美黑人巨大xxx极品| 国产精品一二三视频| 精品亚洲国产成av人片传媒| 亚洲欧美精品一区| 91亚洲精品久久久| 久久综合88中文色鬼| 国产日韩精品电影| 亚洲黄色在线观看| 久久久精品视频在线观看| 伊人伊成久久人综合网小说| 在线观看久久av| 日韩黄色在线免费观看| 黑人巨大精品欧美一区免费视频| 日韩精品亚洲元码| 北条麻妃久久精品| 国产日韩在线免费| 精品成人乱色一区二区| 亚洲伊人久久综合| 亚洲精品国产品国语在线| 成人网欧美在线视频| 91精品中国老女人| 日韩国产高清视频在线| 日韩经典中文字幕| 亚洲精品电影久久久| 欧美激情在线狂野欧美精品| 亚洲视频axxx| 亚洲国产高清自拍| 久久人人爽人人爽人人片av高请| 亚洲第一精品福利| 亚洲国产精彩中文乱码av在线播放| 久久久精品在线| 亚洲日韩欧美视频| 亚洲欧美一区二区三区久久| 亚洲欧美另类自拍| 亚洲男人天堂2024| 国产成人av网| 国产精品扒开腿做爽爽爽视频| 91精品中文在线| 亚洲成年网站在线观看| 亚洲精品乱码久久久久久金桔影视| 亚洲欧美国产精品va在线观看| 久久躁日日躁aaaaxxxx| 亚洲永久在线观看| 欧美性极品xxxx娇小| 欧美激情精品久久久久久久变态| 日韩成人网免费视频| 成人黄色av免费在线观看| 成人在线精品视频| 亚洲精品影视在线观看| 亚洲免费视频在线观看| 国产亚洲欧洲高清一区| 欧美色videos| 91精品久久久久久久久久久| 亚洲久久久久久久久久| 国产午夜精品视频| 久久成人精品电影| 国产欧美精品久久久| 国产在线播放91| 成人网在线观看| 欧美日韩福利在线观看| 色777狠狠综合秋免鲁丝| 国产精品极品尤物在线观看| 亚洲视频777| 国产精品香蕉国产| 久久免费国产视频| 国产性色av一区二区| 日韩av影视在线| 久青草国产97香蕉在线视频| 91中文字幕在线观看| 国产不卡一区二区在线播放| 国产精品久久久久久久av电影| 国产精品91久久| 亚洲精品aⅴ中文字幕乱码| 日韩欧美在线第一页| 国产成人综合精品在线| 国产亚洲精品激情久久| 亚洲国产黄色片| 日韩电视剧在线观看免费网站| 亚洲偷欧美偷国内偷| 亚洲品质视频自拍网| 国产精品一区久久| 综合网日日天干夜夜久久| 疯狂蹂躏欧美一区二区精品| 91色精品视频在线| 欧美性猛交xxxx免费看| 97碰碰碰免费色视频| 97视频在线看| 欧美xxxx综合视频| 九九九久久国产免费| 国产精品普通话| 欧美成人精品不卡视频在线观看| 欧美孕妇毛茸茸xxxx| 成人精品网站在线观看| 亚洲精品一区在线观看香蕉| 久久综合亚洲社区| 色综合久久久久久中文网| 在线观看中文字幕亚洲| 国内精品免费午夜毛片| 久久久久久久97| 亚洲欧美国产另类| 亚洲国产精品久久久久秋霞不卡| 欧美另类在线观看| 国产精品毛片a∨一区二区三区|国| 亚洲a区在线视频| 国产精品丝袜久久久久久高清| 国产亚洲精品成人av久久ww| 欧美成人高清视频| 国内精品久久久久久久| 大荫蒂欧美视频另类xxxx| 亚洲国产日韩欧美在线图片| 亚洲精选中文字幕| 亚洲天堂第一页| 欧美在线亚洲在线| 国产日韩在线精品av| 国产精品白丝jk喷水视频一区| 久久噜噜噜精品国产亚洲综合| 国产精品久久综合av爱欲tv| 国产综合在线视频| 国产91ⅴ在线精品免费观看| 91在线免费网站| 成人久久精品视频| 精品中文字幕在线观看| 久久精品中文字幕电影| 国产精品高潮呻吟视频| 亚洲大尺度美女在线| 青青久久av北条麻妃黑人| 亚洲国产精品成人av|