RecyclerView可以实例化多个视图'每件商品?

时间:2017-10-16 03:32:03

标签: android android-recyclerview recyclerview-layout

TLDR:

通常,在RecyclerView实施中,在AdapterLayoutManager之间,每个项目有一个视图比率。我们希望找到一种方法来为每个项目创建多个视图。

注意:请不要将此与根据适配器位置创建不同视图类型混淆。为简单起见,假设只有一种视图类型。

完整问题:

对于我们的项目,我们需要创建一个多列列表。多列列表在视觉上与网格相同,但有一个明显的区别;在一个网格中(就像用GridLayoutAdapter创建的一个网格),一个' cell' (即View / ViewHolder)代表一个项目。在多列列表中,一个表示一个项目。构成该行的单元格每个都显示相同的单个项目的不同属性。

作为一个例子,假设我有一个包含十个Foo对象的列表,而Foo定义了五个我们想要在列中显示的属性。从我们的数据集的角度来看,有十个项目。然而,从LayoutManager的角度来看,每行/项目有五十个(十个项目(行)乘以五个单元格(列)。)

我倾向于采用的方法是创建一个共同依赖的RecyclerView.Adapter / RecyclerView.LayoutManager对。

首先,在我的适配器子类中,除了创建一个属性来保存我的数据项之外,我还添加了一个' columnCount'属性。然后在getItemCount()覆盖中,而不是像通常那样返回项目数,而是返回项目数乘以columnCount,如下所示:

private List<Object> items;
public List<Object> getItems(){
    return items;
}
public void setItems(List<Object> items){
    this.items = items;
    notifyDataSetChanged();
}

private int columnCount = 1;
public int getColumnCount(){
    return columnCount;
}
public void setColumnCount(int columnCount){
    this.columnCount = Math.max(columnCount, 1);
    notifyDataSetChanged();
}

@Override public final int getItemCount(){
     return getItems().size() * getColumnCount();
}

接下来在我的RecyclerView.LayoutManager子类中,我将其配置为获取传入的适配器,如果我可以将其转换为我的特定适配器类型,那么我可以获取列数并将其用于我的布局计算。如果它不是正确类型的适配器,我只是把它视为只有一列。

现在虽然这种方法似乎有效,但它会稍微混淆API,因为getItemCount()不再返回实际项目的数量,而是返回视图的数量,这可能会让用户感到困惑。 (我希望他们将其命名为getViewCount()。)这也意味着,LayoutManager仅适用于特定的适配器类型。

我还考虑通过使用水平LinearLayout来表示整行,然后在常规列表中使用它来使看起来像多个列一样,但这限制了我们的灵活性(即可以&#39;我做了固定的行/列等等)所以我们放弃了它。

我想知道我是否接近这个错误和/或是否有我已经可以使用的API。有没有这样的事情,或者我是否采取了正确的方法?

2 个答案:

答案 0 :(得分:1)

您可以在适配器级别实现此目的。您将不得不使用这三种方法。

getItemViewType() 
onCreateViewHolder() 
onBindViewHolder()

这是一个帮助你的工作示例。让我知道是否有任何意义。只需将您的项目设为viewpager并添加多个项目页面即可。

https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

答案 1 :(得分:0)

您可以拥有多个具有不同视图的视图持有者,因此可以根据类型使用不同的视图。