最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年12月24日 10:48:53   作者:pigdreams  
今天小編就為大家分享一篇關于Android自定義控件ListView下拉刷新的代碼,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

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下拉后加載數據時的狀態(tài)

實現(xiàn)步驟:

  • 自定義CustomListView繼承自ListView,添加headerView,里面的布局是有下拉刷新的文字與圖片
  • 為listview創(chuàng)建適配器,隨便弄一些數據做一些數據源放入到listview的適配器中,好測試顯示。
  • 自定義的帶有頭部的ListView首先要將頭部視圖隱藏掉,添加頭視圖的代碼是listview.addHeaderView()。
  • 注意:這里并不能用headerView對象的setVisibility()來實現(xiàn)隱藏的效果,當你調用這個添加頭部視圖的方法時,頭部位置不管有沒有視圖都會占據一個位置。所以得用setPadding()的TOP為負數來實現(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){
            //如果回調接口不為空,則進行更新的事務
            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來改變數據更新完之后的界面
    public void OnRefresh(CustomListview customLv);
  }
  // 2.申明接口
  OnRefreshListener onRefreshListener;
  // 3.傳遞接口
  public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
    this.onRefreshListener = onRefreshListener;
  }
  public void refreshComplete(){
    isRefresh=false;
    //更新數據結果后,再回調這個方法
    headerView.setPadding(0, -height, 0, 0);
    // 一定要記得把狀態(tài)改回去,不然會沒法再次向下拉
    currentState = STATE_DONE;
    //將進度條設為不可見,將箭頭設為可見,將文字改回去
    ivArrow.setVisibility(VISIBLE);// 箭頭顯示
    pbRefreshing.setVisibility(GONE);// 進度條隱去
    tvActionTip.setText("下拉刷新");// 改變文字 提示
  }
}

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

  • Kotlin 高階函數與Lambda表達式示例詳解

    Kotlin 高階函數與Lambda表達式示例詳解

    這篇文章主要為大家介紹了Kotlin 高階函數與Lambda表達式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android省電的秘密之JobScheduler

    Android省電的秘密之JobScheduler

    JobScheduler是Android L版本新引入的API,JobScheduler,顧名思義,是用來調度工作。工作被調度的條件包括網絡變化,充電插拔,周期執(zhí)行等。谷歌為什么要引入這個新的API呢?是為了省電而制定的一種規(guī)范。下面跟著小編一起來看下吧
    2017-02-02
  • Android背景圖下拉回彈效果實例

    Android背景圖下拉回彈效果實例

    大家好,本篇文章主要講的是Android背景圖下拉回彈效果實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Android Studio升級到3.0后遇到的坑

    Android Studio升級到3.0后遇到的坑

    自從谷歌發(fā)布Android Studio 3.0版本后,一直心向往之,終于抽時間做了下升級處理,現(xiàn)在把升級過程中遇到的一些問題以及解決方案分享給大家,希望對大家能給有事幫助
    2017-11-11
  • Android入門之IntentService的使用教程詳解

    Android入門之IntentService的使用教程詳解

    IntentService的生命周期中有一個非常好的方法-onHandleIntent方法,它是一個abstract方法,開發(fā)者在實現(xiàn)IntentService時可以覆蓋它來處理“長事務”。本文就來聊聊IntentService的使用,需要的可以參考一下
    2022-12-12
  • 詳解Android studio ndk配置cmake開發(fā)native C

    詳解Android studio ndk配置cmake開發(fā)native C

    這篇文章主要介紹了詳解Android studio ndk配置cmake開發(fā)native C,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • Android編程入門之HelloWorld項目目錄結構分析

    Android編程入門之HelloWorld項目目錄結構分析

    這篇文章主要介紹了Android編程入門之HelloWorld項目目錄結構分析,較為詳細的分析了Android項目的目錄結構與具體作用,需要的朋友可以參考下
    2015-12-12
  • 詳談OnTouchListener與OnGestureListener的區(qū)別

    詳談OnTouchListener與OnGestureListener的區(qū)別

    下面小編就為大家?guī)硪黄斦凮nTouchListener與OnGestureListener的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android ContentProvider查看/讀取手機聯(lián)系人實例

    Android ContentProvider查看/讀取手機聯(lián)系人實例

    本篇文章主要介紹了Android ContentProvider查看/讀取手機聯(lián)系人實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Android 中 Swipe、Scroll 和 Fling 的區(qū)別解析

    Android 中 Swipe、Scroll 和 Fling 的區(qū)別解

    Swipe、Scroll和Fling是Android中常見的觸摸手勢,它們在用戶體驗和技術實現(xiàn)上各有特點,Swipe用于快速切換,Scroll用于連續(xù)滾動,Fling用于實現(xiàn)慣性滾動,開發(fā)者可以根據需求選擇合適的手勢類型,并結合GestureDetector等工具實現(xiàn)各種交互效果,感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評論

临洮县| 孙吴县| 长武县| 拉萨市| 南昌市| 广丰县| 南和县| 迁安市| 甘孜| 鄯善县| 碌曲县| 松潘县| 兴宁市| 深州市| 曲水县| 靖西县| 溧水县| 澜沧| 泸西县| 广灵县| 电白县| 津市市| 宁阳县| 商丘市| 固阳县| 阿拉善右旗| 新沂市| 安陆市| 曲水县| 河东区| 青岛市| 渝中区| 轮台县| 连城县| 宜章县| 武隆县| 迁安市| 垦利县| 遂溪县| 东方市| 祁东县|