动态地向RecyclerView添加视图

时间:2016-07-23 16:32:27

标签: android android-recyclerview recycler-adapter

我的RecyclerView中有2个viewTypes - A和B

从适配器获取数据。 B是一个自定义视图,具有完全不同的布局,并使其自己的Web服务调用数据。

所以我总共有2个ViewHolders(一个用于A,一个用于B)。我的要求是只有在成功从服务器获取所有数据时才显示B.所以,最初我将B视图的可见性设置为GONE,并在有数据显示时重置为VISIBLE。

这种方法的问题在于,即使内容为GONE,也会显示B视图的分隔符(使用ItemDecoration设置)。加载B视图时,这会导致RecyclerView出现较大差距。如果它们无法加载,我会删除B视图,因此该部分不是问题。

查看ItemDecoration API,我认为没有办法有条件地显示分隔符。

所以我正在寻找一种在RecyclerView之外创建B视图的方法,然后将视图本身添加到RecyclerView。可能吗 ?或者我的问题有更好的解决方案吗?

一种可能的解决方法是删除ItemDecoration,而是向视图A和B添加边距,并在收到数据时将B的边距重置为0到更高的值。我没有测试过这种方法,但是我想避免使用它,因为我有太多的viewTypes(A和B只是其中的两个),而且大多数都是自定义视图,其布局我将不得不改变。

1 个答案:

答案 0 :(得分: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服务调用后,您可以重新填充该列表中的数据,然后在notifyDatasetChanged中调用Adapter