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

首頁 > 系統(tǒng) > Android > 正文

Android自定義控件ListView下拉刷新的代碼

2019-10-21 21:32:00
字體:
供稿:網(wǎng)友

ListView在實際實用中,一般都會有下新刷新和上拉加載的動態(tài)效果,今天要學的就是如何自定義帶下拉刷新的ListView。

原理解析:一般將有下拉刷新的listview分成四種不同的狀態(tài)來進行不同的顯示效果。

  • 1.完成狀態(tài)done:listview正常顯示狀態(tài)
  • 2.下拉狀態(tài)pull:listview正在下拉時的狀態(tài)
  • 3.釋放狀態(tài)release:listview下拉后松開的狀態(tài)
  • 4.更新狀態(tài)refreshing:listview下拉后加載數(shù)據(jù)時的狀態(tài)

實現(xiàn)步驟:

  • 自定義CustomListView繼承自ListView,添加headerView,里面的布局是有下拉刷新的文字與圖片
  • 為listview創(chuàng)建適配器,隨便弄一些數(shù)據(jù)做一些數(shù)據(jù)源放入到listview的適配器中,好測試顯示。
  • 自定義的帶有頭部的ListView首先要將頭部視圖隱藏掉,添加頭視圖的代碼是listview.addHeaderView()。
  • 注意:這里并不能用headerView對象的setVisibility()來實現(xiàn)隱藏的效果,當你調(diào)用這個添加頭部視圖的方法時,頭部位置不管有沒有視圖都會占據(jù)一個位置。所以得用setPadding()的TOP為負數(shù)來實現(xiàn)這個功能。
  • 具體代碼實現(xiàn)
package com.hapzhu.customlv;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;public class CustomListview extends ListView {  View headerView;  int height;  private TextView tvActionTip;  private ImageView ivArrow;  private ProgressBar pbRefreshing;  final static int STATE_DONE = 1;  final static int STATE_PULL = 2;  final static int STATE_RELEASE = 3;  final static int STATE_REFRESHING = 4;  int currentState;  int downY;  public CustomListview(Context context, AttributeSet attrs) {    super(context, attrs);    headerView = View.inflate(context, R.layout.listview_header, null);    this.addHeaderView(headerView);    // 用setPadding方法設置Top的大小來把headerview隱藏掉    // 不能用GetHeight方法來實現(xiàn),因為這個方法只能用來測試可見的控件    // 要用measureHeight的方法來實現(xiàn)測試,這個方法要先測試0,0的位置    headerView.measure(0, 0);    height = headerView.getMeasuredHeight();    headerView.setPadding(0, -height, 0, 0);    initView();    // 設置第一個狀態(tài)    currentState = STATE_DONE;  }  private void initView() {    tvActionTip = (TextView) headerView.findViewById(R.id.tv_state);    ivArrow = (ImageView) headerView.findViewById(R.id.iv_arrow);    pbRefreshing = (ProgressBar) headerView.findViewById(R.id.progressBar);  }  boolean isRefresh = false;  @Override  public boolean onTouchEvent(MotionEvent ev) {    try {      // 事件類型      int action = ev.getAction();      switch (action) {      case MotionEvent.ACTION_DOWN:// 往下滑的手勢        if (currentState == STATE_DONE) {// 只有在完成狀態(tài)時才會有業(yè)務動作          // 觸發(fā)下拉手勢的Y坐標          downY = (int) ev.getY();          // 切換狀態(tài)          currentState = STATE_PULL;        }        break;      case MotionEvent.ACTION_MOVE:// 正在拖動的手勢        if (currentState == STATE_PULL) {// 只有在下拉狀態(tài)時才會有動作          int currentY = (int) ev.getY();// 得到正在不斷改變的當前Y坐標          int top = currentY - downY - height;// 這個值是下拉時頭部視圖的高度顯示,要慢慢變化          headerView.setPadding(0, top, 0, 0);          if (currentY - downY > height) {// 如果下拉的高度超過了頭視圖的高度,則改變狀態(tài)            currentState = STATE_RELEASE;            tvActionTip.setText("松開刷新");          }        }        break;      case MotionEvent.ACTION_UP:        if (currentState == STATE_RELEASE) {// 只有在釋放狀態(tài)時才進行刷新動作          tvActionTip.setText("刷新中");// 改變文字 提示          currentState = STATE_REFRESHING;// 改變狀態(tài),變?yōu)樗⑿聽顟B(tài)          ivArrow.setVisibility(GONE);// 箭頭隱藏          pbRefreshing.setVisibility(VISIBLE);// 進度條顯示          isRefresh = true;          if(onRefreshListener!=null){            //如果回調(diào)接口不為空,則進行更新的事務            onRefreshListener.OnRefresh(this);          }        } else {          if (!isRefresh) {            // 如果當前的下拉距離小于高度時,再把頭部視圖隱藏            headerView.setPadding(0, -height, 0, 0);            // 一定要記得把狀態(tài)改回去,不然會沒法再次向下拉            currentState = STATE_DONE;          }        }        break;      }    } catch (Exception e) {    }    return super.onTouchEvent(ev);  }  // 1定義接口  interface OnRefreshListener {    // 在主程序中使用框架中的Custom來改變數(shù)據(jù)更新完之后的界面    public void OnRefresh(CustomListview customLv);  }  // 2.申明接口  OnRefreshListener onRefreshListener;  // 3.傳遞接口  public void setOnRefreshListener(OnRefreshListener onRefreshListener) {    this.onRefreshListener = onRefreshListener;  }  public void refreshComplete(){    isRefresh=false;    //更新數(shù)據(jù)結(jié)果后,再回調(diào)這個方法    headerView.setPadding(0, -height, 0, 0);    // 一定要記得把狀態(tài)改回去,不然會沒法再次向下拉    currentState = STATE_DONE;    //將進度條設為不可見,將箭頭設為可見,將文字改回去    ivArrow.setVisibility(VISIBLE);// 箭頭顯示    pbRefreshing.setVisibility(GONE);// 進度條隱去    tvActionTip.setText("下拉刷新");// 改變文字 提示  }}

今天新學了UML圖,于是就將這個狀態(tài)圖畫出來了。

Android,ListView,下拉刷新,代碼

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沂南县| 福贡县| 洛南县| 山丹县| 鹿邑县| 绿春县| 安乡县| 高阳县| 西盟| 隆德县| 水富县| 玛多县| 通道| 乌拉特前旗| 西安市| 道真| 永清县| 华亭县| 南漳县| 扬州市| 南涧| 永新县| 商都县| 兰州市| 台安县| 玛纳斯县| 垣曲县| 光山县| 琼结县| 汉源县| 台南市| 灵台县| 衡阳县| 弥渡县| 宜宾县| 乐至县| 通海县| 盘锦市| 陈巴尔虎旗| 永登县| 布拖县|