2015-08-03 272 views
23

有沒有辦法恢復刷卡動作和視圖持有人恢復到初始位置後刷卡完成,onSwiped被呼籲ItemTouchHelper.Callback實例?我得到了RecyclerViewItemTouchHelperItemTouchHelper.Callback實例在一起很好地工作,我只需要恢復的刷卡動作和消除某些情況下,刷卡項目。的Android RecyclerView ItemTouchHelper恢復刷卡和恢復視圖架

+0

你有答案嗎? – maveroid

+0

@maveroid是的,請看下面。 –

+0

謝謝..尼克斯工作.. – maveroid

回答

17

谷歌的ItemTouchHelper執行假定被刷掉的項目將最終從回收站視圖中刪除,而在某些應用程序中可能不是這種情況。

RecoverAnimationItemTouchHelper中的嵌套類,用於管理滑動/拖動項目的觸摸動畫。雖然顧名思義,它僅恢復項目的位置,它實際上是用來恢復(取消刷卡/拖動)更換(搬出刷卡或拖替換)項目的唯一類。奇怪的命名。

RecoverAnimation中有一個名爲mIsPendingCleanup的布爾屬性,其中ItemTouchHelper用於確定該項目是否正在等待刪除。所以ItemTouchHelper,附加RecoverAnimation該項目後,將成功刷出來後該屬性,並且動畫沒有得到恢復從動畫列表中,只要這個屬性被設置刪除。問題是,mIsPendingCleanup將永遠爲一個刷卡出項進行設置,從而導致RecoverAnimation該項目永遠不會被從動畫列表中刪除。因此,即使您在繼續滑動後恢復了物品的位置,只要您觸摸該物品,它就會立即返回到已移出的位置 - 因爲RecoverAnimation會使動畫從最新的滑出位置開始。

不幸的是,將ItemTouchHelper類源代碼複製到與支持庫中相同的包中,並從RecoverAnimation類中刪除mIsPendingCleanup屬性。我不確定這是否可以被Google接受,並且我尚未向Play Store發佈更新,以確定它是否會導致拒絕,但您可以從支持庫v22.2.1中找到類別源代碼在https://gist.github.com/kukabi/f46e1c0503d2806acbe2提到上述修復。

+0

請您介紹一下這個解決方案的一些細節。還沒有得到它 – Clxy

+1

即使現在這個假設是有效的嗎? –

54

一些隨機戳後,我找到了解決辦法。請在您的適配器上撥打notifyItemChanged。這將使得視覺效果翻轉回到原始位置。

+2

這似乎工作正常,謝謝。 –

+1

大部分時間都適用,但有些時候這種情況不適用。 – jaga

+0

雖然這個解決方案似乎工作。刪除幾次輕掃後,如果您滾動列表並回滾到相同的位置,您可能會看到少數列表元素丟失。對於我來說,Kustal Kaan Bilgin的解決方案比這更好。 – jaga

6

此問題的一個骯髒的解決辦法的解決方案是通過調用ItemTouchHelper::attachToRecyclerView(RecyclerView)兩次,然後調用私有方法ItemTouchHelper::destroyCallbacks()重新連接的ItemTouchHelper。 destroyCallbacks()刪除項目裝飾和所有聽衆,但也清除所有RecoverAnimations。

請注意,我們需要先致電itemTouchHelper.attachToRecyclerView(null)以誘使ItemTouchHelper認爲第二次致電itemTouchHelper.attachToRecyclerView(recyclerView)是一個新的回收視圖。

進一步的細節看一看成ItemTouchHelperhere的源代碼。解決方法的

實施例:

RecyclerView recyclerView = findViewById(R.id.recycler_view); 
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); 

... 
// Workaround to reset swiped out views 
itemTouchHelper.attachToRecyclerView(null); 
itemTouchHelper.attachToRecyclerView(recyclerView); 

考慮它作爲一個髒解決方法,因爲該方法使用的ItemTouchHelper內部,未記錄的實現細節。

更新

ItemTouchHelper::attachToRecyclerView(RecyclerView)documentation

如果TouchHelper已連接到一個RecyclerView,它首先會從以前的一個分離。您可以使用null調用此方法以將其從當前的RecyclerView分離。

和參數文件中:

的RecyclerView實例您想,如果你想從目前的RecyclerView刪除ItemTouchHelper添加該助手或空。

所以至少它是部分記錄。

+0

如果我沒有結婚,我會和你結婚。謝謝你,這是爲我工作的唯一解決方案。 –

+0

您的解決方案使該行無需任何動畫即可輕鬆滑動。這是更容易,並避免了取決於您的代碼notifyItemChanged隨附的一些樣板代碼,但它不具有吸引力。 – RJFares

0

呼叫notifyDataSetChanged您的適配器,使刷卡回來工作相一致

+1

這應該是正確的評論 –

1

你應該ItemTouchHelper.Callback覆蓋onSwiped方法,並刷新該特定項目。

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, 
    int direction) { 
    adapter.notifyItemChanged(viewHolder.getAdapterPosition()); 
}