2015-08-25 159 views
2

我看到在RecyclerView使用GridLayoutManager與2跨度奇怪的行爲。RecyclerView與GridLayoutManager插入項目錯誤的位置

我試圖讓項目的兩列:

0 1 
2 3 
4 5 
6 7 

...等等

要做到這一點,我創建一個GridLayoutManager像這樣:

GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); 
    gridLayoutManager.setOrientation(GridLayoutManager.VERTICAL); 

最初這表現完美。我的商品以我希望他們訂購的順序出現。

但是,我還需要能夠從列表中刪除項目,然後撤消刪除,如果用戶足夠快地行動。

要刪除項目,然後允許撤消/插入項目,我會在用戶點擊RecyclerView項目中的「刪除」按鈕時執行以下邏輯。

final Item = mItems.getItem(position); 
    mItems.remove(position); 
    notifyItemRemoved(position); 

    // Give the user a chance to undo the removal 
    Snackbar.make(getView(), 
        "Item Removed", Snackbar.LENGTH_LONG) 
      .setAction(R.string.item_removed_snackbar_undo, new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       { 
        mItems.add(position, item); 
        notifyItemInserted(position); 
       } 
      }).show(); 

mItems代表我的適配器中的項目列表。 position表示具有單擊刪除按鈕的項目的適配器位置。

刪除項目表現完美。我可以刪除項目,並且可以添加動畫以填充空白空間。但是,當我嘗試撤消刪除操作並將其添加回來時,回收站視圖會變得混亂,並且會插入空白空間。舉例來說,如果我有以下的項目,我已刪除項目2,然後解開了拆除,這是會發生什麼:

0 1 
2 3 

刪除2

0 1 
3 

加2回

0 1 
2 
3 

此時,應存在3個「空」視圖(第二行,第二列)。如果我查詢適配器的大小,我仍然可以得到4件物品,但是不知何故,這些物品被分散到總共5個位置。觸摸空的空間什麼都不做,但如果我重新調整/配置改變佈局可以追溯到

0 1 
2 3 

預期。

我做錯了什麼?

感謝, 扎克

+0

我有一個類似的問題,但後我雖然我意識到有一種情況時,onCreateViewHolder()方法返回一個緩存的RecyclerView.ViewHolder - onCreateViewHolder必須總是返回一個新的RecycleriView.ViewHolder或RecyclerView.ViewHolder實例,它是在外部創建的RecyclerView池,該錯誤也造成了很多崩潰 – mstrengis

+0

感謝您的快速響應。我的代碼總是在我的onCreateViewHolder()方法中返回一個新的ViewHolder,所以我不認爲這是不幸的。 – Zach

回答

2

我發現了這個問題!

我打電話mRecyclerView.scrollToPosition(position)後我的邏輯重新插入項目。我錯誤地將這段代碼從上面的代碼中刪除了,因爲我認爲它是不相關的(將來我會更加小心)。

無論如何,似乎有這種呼籲結果在時髦的行爲。如果我刪除了這個調用,一切都按預期工作。我懷疑這是取消動畫或導致其他不能正常工作。

現在我仍然想讓我的物品可見(如果用戶將其刪除,請將其滾動到屏幕外,然後點擊撤消),但稍後我會解決這個問題 - 現在已足夠好了。

相關問題