2016-07-23 76 views
0

我在我的RecyclerView中有2個視圖類型 - A和B動態添加視圖到RecyclerView

A從適配器獲取它的數據。 B是一個具有完全不同佈局的自定義視圖,並使其自己的Web服務調用數據。

所以我總共有2個ViewHolders(一個用於A,一個用於B)。我的要求是僅在成功從服務器獲取所有數據時才顯示B.因此,最初我將B視圖的可見性設置爲GONE,並在有數據顯示時重置爲可見。

這種方法的問題在於,即使在內容爲GONE的情況下,B視圖的分隔符(使用ItemDecoration設置)也會顯示。當B視圖加載時,這會在RecyclerView中造成很大的差距。如果它們加載失敗,我刪除B視圖,所以這部分不是問題。

看着ItemDecoration API我認爲沒有辦法有條件地顯示分隔符。

所以我正在尋找一種方法來創建RecyclerView之外的B視圖,然後將視圖本身添加到RecyclerView中。可能嗎 ?還是有更好的解決我的問題?

一個可能的解決方法是刪除ItemDecoration,而是向視圖A和B添加邊距,並在收到數據時將B的邊距從0更改爲較高值。我沒有測試過這種方法,但我想避免它,因爲我有太多的viewType(A和B只是其中的兩個),其中大多數是自定義視圖,其佈局我將不得不改變。

回答

0

我想向您推薦一個從哪裏填寫RecyclerView的常用列表。因此,當B項目完成其服務呼叫時,它們將相應地插入該公共列表中,並且通過在適配器上調用notifyDatasetChanged,列表中的更改可以很容易地生效。

所以這裏有一個我想提出的常見類。

public class CommonClass { 
    public ClassA; 
    public ClassB; 
    public ClassC; 

    // .... You can put other classes here as you need to populate all the items in a single list 

    // You can set this tag like "A" to specify this object is a A type object. 
    // This is necessary when you'll populate the items in your list. 
    // You'll check the tag first in your `getView` method and will take actions accordingly after checking the tag. 
    public String tag; 
} 

現在取一個CommonClass的列表,然後填充項目。當Web服務呼叫完成後,您可以重新填充該列表中的數據,然後在您的Adapter中撥打notifyDatasetChanged