91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Android應用中利用ListView實現一個監聽滑動事件

發布時間:2020-11-27 15:45:55 來源:億速云 閱讀:207 作者:Leah 欄目:移動開發

怎么在Android應用中利用ListView實現一個監聽滑動事件?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

ListView的主要有兩種滑動事件監聽方法,OnTouchListener和OnScrollListener

1、OnTouchListener

OnTouchListener方法來自View中的監聽事件,可以在監聽三個Action事件發生時通過MotionEvent的getX()方法或getY()方法獲取到當前觸摸的坐標值,來對用戶的滑動方向進行判斷,并可在不同的Action狀態中做出相應的處理

mListView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            // 觸摸按下時的操作

            break;
          case MotionEvent.ACTION_MOVE:
            // 觸摸移動時的操作

            break;
          case MotionEvent.ACTION_UP:
            // 觸摸抬起時的操作

            break;
        }
        return false;
      }
 });

不僅僅只有上面的三種Action狀態,MotionEvent類中還定義了很多其它狀態,我們可以靈活的使用這些狀態

? MotionEvent.ACTION_DOWN:開始觸摸

? MotionEvent.ACTION_MOVE:觸摸移動

? MotionEvent.ACTION_UP:觸摸抬起

? MotionEvent.ACTION_OUTSIDE:觸摸范圍超過了UI邊界

? MotionEvent.ACTION_CANCEL:觸摸被取消時

? MotionEvent.ACTION_POINTER_DOWN:當有另外一個觸摸按下時(多點觸摸)

? MotionEvent.ACTION_POINTER_UP:當另一個觸摸抬起時(多點觸摸)

2、OnScrollListener

OnScrollListener來自AbsListView中的監聽事件,因為ListView直接繼承自AbsListView,所以在AbsListView中有很多ListView相關信息

OnScrollListener中有兩個回調方法

? public void onScrollStateChanged(AbsListView view, int scrollState):監聽滑動狀態的改變

? public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount):監聽滑動

在源碼中有其詳細的解釋

  /**
   * Interface definition for a callback to be invoked when the list or grid
   * has been scrolled.
   */
  public interface OnScrollListener {

    /**
     * The view is not scrolling. Note navigating the list using the trackball counts as
     * being in the idle state since these transitions are not animated.
     */
    public static int SCROLL_STATE_IDLE = 0;

    /**
     * The user is scrolling using touch, and their finger is still on the screen
     */
    public static int SCROLL_STATE_TOUCH_SCROLL = 1;

    /**
     * The user had previously been scrolling using touch and had performed a fling. The
     * animation is now coasting to a stop
     */
    public static int SCROLL_STATE_FLING = 2;

    /**
     * Callback method to be invoked while the list view or grid view is being scrolled. If the
     * view is being scrolled, this method will be called before the next frame of the scroll is
     * rendered. In particular, it will be called before any calls to
     * {@link Adapter#getView(int, View, ViewGroup)}.
     *
     * @param view The view whose scroll state is being reported
     *
     * @param scrollState The current scroll state. One of
     * {@link #SCROLL_STATE_TOUCH_SCROLL} or {@link #SCROLL_STATE_IDLE}.
     */
    public void onScrollStateChanged(AbsListView view, int scrollState);

    /**
     * Callback method to be invoked when the list or grid has been scrolled. This will be
     * called after the scroll has completed
     * @param view The view whose scroll state is being reported
     * @param firstVisibleItem the index of the first visible cell (ignore if
     *    visibleItemCount == 0)
     * @param visibleItemCount the number of visible cells
     * @param totalItemCount the number of items in the list adaptor
     */
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
        int totalItemCount);
  }

2.1 OnScrollSateChanged方法

OnScrollSateChanged根據scrollState來決定其回調的次數,它有三種模式:

? OnScrollListener.SCROLL_STATE_IDLE:滾動停止時的狀態

? OnScrollListener.SCROLL_STATE_STOUCH_SCROLL:觸摸正在滾動,手指還沒離開界面時的狀態

? OnScrollListener.SCROLL_STATE_FLING:用戶在用力滑動后,ListView由于慣性將繼續滑動時的狀態

當用戶沒有用力滑動時,OnScrollSateChanged方法只會回調2次,否則回調三次,我們在使用時通常會以設置Flag標志,來區分不同的滑動狀態,從而進行相應的處理

2.2 OnScroll方法

在ListView滾動時會一直被回調,它通過里面有三個參數來顯示當前ListView的滾動狀態

? firstVisibleItem:當前能看見的第一個item的ID(從0開始)

? visibleItemCount:當前可見的item總數

? totalItemCount:列表中適配器總數量,也就是整個ListView中item總數

注意:當前可見的item總數,包括屏幕中沒有顯示完整的item,如顯示一半的item也會算在可見范圍內

通過這三個參數,我么可以實現很多事件判斷,如:

(1)判斷當前是否滑動到最后一行

當前視圖中第一個item的ID加上當前屏幕中可見item的總數如果等于ListView中所有item總數時,就表示移動到了最后一行

if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
// 滾動到最后一行了
}

(2)判斷滑動的方向

通過oldVisibleItem 記錄上一次firstVisibleItem的位置,再與滑動后的firstVisibleItem進行比較,就可得知滑動的方向

if (firstVisibleItem > oldVisibleItem) {
// 向上滑動
}
if (firstVisibleItem < oldVisibleItem) {
// 向下滑動
}
oldVisibleItem = firstVisibleItem;

ListView也為我們提供了一些封裝好了的方法,來獲取item的位置信息

// 獲取當前可見區域內第一個item的id
mListView.getFirstVisiblePosition();

// 獲取當前可見區域內最后一個item的id
mListView.getLastVisiblePosition();

看完上述內容,你們掌握怎么在Android應用中利用ListView實現一個監聽滑動事件的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

信阳市| 西宁市| 会同县| 甘泉县| 德阳市| 天气| 宜阳县| 宣武区| 扶绥县| 渭源县| 海林市| 兴业县| 垫江县| 体育| 朝阳区| 常州市| 乌拉特前旗| 桐城市| 永顺县| 双峰县| 商丘市| 松江区| 娄烦县| 巴林右旗| 海城市| 五家渠市| 海口市| 绍兴县| 锡林浩特市| 澜沧| 巫山县| 左权县| 喀什市| 潮州市| 休宁县| 皋兰县| 兰州市| 安陆市| 石棉县| 广河县| 张北县|