2016-07-23 90 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