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

Android ListView監(jiān)聽(tīng)滑動(dòng)事件的方法(詳解)

 更新時(shí)間:2017年03月13日 10:24:42   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇Android ListView監(jiān)聽(tīng)滑動(dòng)事件的方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

ListView的主要有兩種滑動(dòng)事件監(jiān)聽(tīng)方法,OnTouchListener和OnScrollListener

1、OnTouchListener

OnTouchListener方法來(lái)自View中的監(jiān)聽(tīng)事件,可以在監(jiān)聽(tīng)三個(gè)Action事件發(fā)生時(shí)通過(guò)MotionEvent的getX()方法或getY()方法獲取到當(dāng)前觸摸的坐標(biāo)值,來(lái)對(duì)用戶(hù)的滑動(dòng)方向進(jìn)行判斷,并可在不同的Action狀態(tài)中做出相應(yīng)的處理

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

            break;
          case MotionEvent.ACTION_MOVE:
            // 觸摸移動(dòng)時(shí)的操作

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

            break;
        }
        return false;
      }
 });

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

• MotionEvent.ACTION_DOWN:開(kāi)始觸摸

• MotionEvent.ACTION_MOVE:觸摸移動(dòng)

• MotionEvent.ACTION_UP:觸摸抬起

• MotionEvent.ACTION_OUTSIDE:觸摸范圍超過(guò)了UI邊界

• MotionEvent.ACTION_CANCEL:觸摸被取消時(shí)

• MotionEvent.ACTION_POINTER_DOWN:當(dāng)有另外一個(gè)觸摸按下時(shí)(多點(diǎn)觸摸)

• MotionEvent.ACTION_POINTER_UP:當(dāng)另一個(gè)觸摸抬起時(shí)(多點(diǎn)觸摸)

2、OnScrollListener

OnScrollListener來(lái)自AbsListView中的監(jiān)聽(tīng)事件,因?yàn)長(zhǎng)istView直接繼承自AbsListView,所以在AbsListView中有很多ListView相關(guān)信息

OnScrollListener中有兩個(gè)回調(diào)方法

• public void onScrollStateChanged(AbsListView view, int scrollState):監(jiān)聽(tīng)滑動(dòng)狀態(tài)的改變

• public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount):監(jiān)聽(tīng)滑動(dòng)

在源碼中有其詳細(xì)的解釋

  /**
   * 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根據(jù)scrollState來(lái)決定其回調(diào)的次數(shù),它有三種模式:

• OnScrollListener.SCROLL_STATE_IDLE:滾動(dòng)停止時(shí)的狀態(tài)

• OnScrollListener.SCROLL_STATE_STOUCH_SCROLL:觸摸正在滾動(dòng),手指還沒(méi)離開(kāi)界面時(shí)的狀態(tài)

• OnScrollListener.SCROLL_STATE_FLING:用戶(hù)在用力滑動(dòng)后,ListView由于慣性將繼續(xù)滑動(dòng)時(shí)的狀態(tài)

當(dāng)用戶(hù)沒(méi)有用力滑動(dòng)時(shí),OnScrollSateChanged方法只會(huì)回調(diào)2次,否則回調(diào)三次,我們?cè)谑褂脮r(shí)通常會(huì)以設(shè)置Flag標(biāo)志,來(lái)區(qū)分不同的滑動(dòng)狀態(tài),從而進(jìn)行相應(yīng)的處理

2.2 OnScroll方法

在ListView滾動(dòng)時(shí)會(huì)一直被回調(diào),它通過(guò)里面有三個(gè)參數(shù)來(lái)顯示當(dāng)前ListView的滾動(dòng)狀態(tài)

• firstVisibleItem:當(dāng)前能看見(jiàn)的第一個(gè)item的ID(從0開(kāi)始)

• visibleItemCount:當(dāng)前可見(jiàn)的item總數(shù)

• totalItemCount:列表中適配器總數(shù)量,也就是整個(gè)ListView中item總數(shù)

注意:當(dāng)前可見(jiàn)的item總數(shù),包括屏幕中沒(méi)有顯示完整的item,如顯示一半的item也會(huì)算在可見(jiàn)范圍內(nèi)

通過(guò)這三個(gè)參數(shù),我么可以實(shí)現(xiàn)很多事件判斷,如:

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

當(dāng)前視圖中第一個(gè)item的ID加上當(dāng)前屏幕中可見(jiàn)item的總數(shù)如果等于ListView中所有item總數(shù)時(shí),就表示移動(dòng)到了最后一行

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

(2)判斷滑動(dòng)的方向

通過(guò)oldVisibleItem 記錄上一次firstVisibleItem的位置,再與滑動(dòng)后的firstVisibleItem進(jìn)行比較,就可得知滑動(dòng)的方向

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

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

// 獲取當(dāng)前可見(jiàn)區(qū)域內(nèi)第一個(gè)item的id
mListView.getFirstVisiblePosition();

// 獲取當(dāng)前可見(jiàn)區(qū)域內(nèi)最后一個(gè)item的id
mListView.getLastVisiblePosition();

以上這篇Android ListView監(jiān)聽(tīng)滑動(dòng)事件的方法(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

即墨市| 保康县| 农安县| 阿拉善右旗| 阳西县| 高邑县| 武冈市| 奉化市| 平乡县| 思茅市| 兴义市| 五家渠市| 靖安县| 奈曼旗| 永嘉县| 攀枝花市| 南安市| 通江县| 大丰市| 册亨县| 华阴市| 大洼县| 新巴尔虎左旗| 饶阳县| 沙河市| 江华| 车险| 金平| 淮滨县| 秭归县| 北宁市| 湟中县| 临沭县| 隆化县| 隆安县| 乌拉特前旗| 蕉岭县| 棋牌| 陆丰市| 农安县| 甘德县|