具有动态标题的Recyclerview多视图类型

时间:2019-04-27 16:31:56

标签: android android-recyclerview

我熟悉RecyclerView多个视图项。

最近,我遇到了有关基于某些条件添加动态标头的问题。 我正在尝试使用给定的数据,但我的逻辑似乎不起作用

在这里,我有一个包含4个项目的自定义列表

{"en":"Candy"}, name='c1', id= 1}
{"en":"Bar"}, name='c2', id= 2}
{"en":"Bar"}, name='c3', id= 3 }
{"en":"Donut"}, name='c4', id= 4}

现在,如何在getViewType(intposition)中编写条件,以便结果输出带有标题视图。

Candy
tv -> c1   tv->id1

Bar
tv ->c2     tv->id2 
tv ->c3     tv->id3

Donut
tv ->c4     tv -> id4

任何帮助将不胜感激。我从未尝试添加动态标头。

1 个答案:

答案 0 :(得分:0)

我假设列表项按顺序出现。然后,在列出Candy之后,您将得到Bar的列表,然后是Donut的列表,依此类推。我有一个类似的实现here in Github,在这里您可能会想到如何使用不同的视图类型来实现这一点。

我希望建议从原始列表中解析出不同的列表,如下所示。

ArrayList<Sweet> candyList = getAllCandiesFromTheOriginalList();
ArrayList<Sweet> barList = getAllBarsFromTheOriginalList();
ArrayList<Sweet> donutList = getAllDonutsFromTheOriginalList(); 

拥有所有列表后,您可以跟踪每个单独列表的大小,并在getItemViewType函数中获得相应的视图类型。

// Initialize these variables in the constructor of your adapter
// Make these variables global, so that it can be used from other functions. 
int candyListSize = candyList.size();
int barListSize = barList.size();
int donutListSize = donutList.size();
int totalSize = candyListSize + barListSize + donutListSize;

int CANDY_HEADER_TYPE = 99;
int BAR_HEADER_TYPE = 98;
int DONUT_HEADER_TYPE = 97;

// I assume that candy, bar, and donut comes sequentially in your RecyclerView
@Override
public int getItemViewType(int position) {

    if (position == 0) return CANDY_HEADER_TYPE;
    else if (position == candyListSize + 1) return BAR_HEADER_TYPE;
    else if (position == candyListSize + barListSize + 2) return DONUT_HEADER_TYPE;

    return super.getItemViewType(position);
}

@Override
public int getItemCount() {
    return totalSize + 3; // As there will be 3 extra headers.
}

您还需要智能地实现onBindViewHolder

这可能无法为您提供所遇到问题的确切解决方案。但是,我希望这有助于您了解如何解决该问题。