2016-02-04 81 views
13

回收站視圖現在有3個狀態。區分回收站視圖中的拖動操作和垃圾回收操作

SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING

上調同樣包括一扔state.I不能確定什麼是對此做一個issue

有沒有一種方法來區分Dragler和回收站查看。

編輯:有這樣功能的要求: 當用戶甩,我希望能夠暫停加載圖像(所有圖片均爲URL請求)的回收視圖和恢復,一旦他達到感興趣的項目,從而確保他當前正在查看的圖像在其他圖像之前加載。

+0

據我可以告訴問題和當前的源代碼,沒有簡單的方法來做到這一點。雖然有其他選擇。你想達到什麼目的? –

+0

這將是一個非常長的原因。但總的來說,我需要在用戶瀏覽完畢後對當前項目執行一個過程。 – Droidekas

+0

當用戶閃動什麼?其中一項?向下或向上回收者視圖?他是否把它扔掉了一件物品,比如解僱它?用戶界面上發生的情況是,除了停止所有圖像加載之外,用戶還做了一次投擲遊戲? –

回答

6

SCROLL_STATE_FLING項目恢復時,用戶停止:否較長的RecyclerView的一部分,因爲它沒有在documentation here

提到的關於你的要求

RecyclerView位於android.view.ViewGroup之內,並根據其源代碼extends ViewGroupdocumentation here

RecyclerView中的滾動是RecyclerView和LinearLayoutManager之間的分離。有兩種情況需要處理:

  1. 用戶轉動視圖。默認行爲是RecyclerView將投擲傳遞給內部Scroller,然後執行滾動魔術。這是有問題的,因爲RecyclerView通常安置在未綁定的位置。通過覆蓋RecyclerView fling()實現而不是flingingsmoothscrollLinearLayoutManager來解決此問題。
  2. 用戶以不足的速度擡起手指以啓動滾動。在這種情況下不會發生任何反應。如果要在視圖不處於捕捉位置時檢測此情況,可以通過覆蓋onTouchEvent方法來執行此操作。

看到這裏查看詳細Snappy scrolling in RecyclerView

幾個ViewPager暗示,值得一提的RecyclerView是它的一個孩子:

  1. 想想修改的被緩存的頁面數。當您只有3或4頁時,這一點尤其重要。默認設置將在當前頁面的任一側存儲1頁。在有3頁的情況下,滑動到中間頁面將意味着您的所有頁面都將被緩存。然後滑動到第一頁或最後一頁將丟失內存中的一頁,並且在您再次滑回時需要重新創建並重新添加。通過設置setOffscreenPageLimit(2),您可以讓所有頁面始終保持在內存中。這是性能和內存考慮之間的折衷,因此,聽取低內存警告並準備在必要時刪除邊緣頁面是個好主意。

  2. 如果您試圖在ViewPager中替換Views,僅僅更改適配器後面的數據集並調用notifyDataSetChanged()是不夠的。您還需要確保您已正確實施getItemPosition(Object object),並返回POSITION_NONE以查找已更改的項目,並返回POSITION_UNCHANGED或未更改項目的實際位置。

  3. 添加的另一個API是setPageMargin()setPageMarginDrawable(),允許您輕鬆分離您的頁面。

看到這裏查看詳細Horizontal View Swiping with ViewPager, Updated

一拖一一扔

對於功能您可以使用一些RecyclerView's相關類的區別:

  1. ItemTouchHelper,這是一個ut ility class添加輕掃以解除並拖拽支持RecyclerView。

  2. ItemTouchHelper.Callback,這是ItemTouchHelper和您的應用程序

對於一扔之間的合同你可以看到

  1. Android fling actions on a RecyclerView

  2. Android : Control Smooth scroll over recycler view

+0

Drag功能部分在這裏看起來很相關,但是這仍然看起來像是通過使用用於其他目的的單個項目偵聽器來進行破解。 – Droidekas

+0

@Droidekas,在沒有可靠的解決方案之前,我認爲工作會更好。 – Tauqir

3

我用的SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING的組合來做到這一點:這裏是我的代碼:

@Override 
      public void onScrollStateChanged(int newState) { 
       if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) { 
        if (mAdapter != null) 
         mAdapter.pauseImageLoading(); 
       } else if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
        if (mAdapter != null) 
         mAdapter.resumeImageLoading(); 
       } 

這同樣適用於我,你想讓它在感興趣

+0

我試過了,它在這種情況下不起作用:你突然停止滾動,你正在加載的項目沒有加載,因爲該請求已被拒絕作爲滾動的一部分 – Droidekas

+0

它適用於我,請給我你的代碼 –

1

您的問題可能以不同的方式解決。你可以嘗試推遲你的請求幾百毫秒(確切的數字將需要調整)。如果列表項在毫秒內滾動離屏,則可以在請求發送之前取消該請求。這個想法是,如果你扔了,視圖將快速滾動屏幕外,以便請求在發送之前總是被取消。如果他們不投擲,那麼每個請求的額外毫秒數希望不會太差。