通常,在RecyclerView
实施中,在Adapter
和LayoutManager
之间,每个项目有一个视图比率。我们希望找到一种方法来为每个项目创建多个视图。
注意:请不要将此与根据适配器位置创建不同视图类型混淆。为简单起见,假设只有一种视图类型。
对于我们的项目,我们需要创建一个多列列表。多列列表在视觉上与网格相同,但有一个明显的区别;在一个网格中(就像用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。有没有这样的事情,或者我是否采取了正确的方法?
答案 0 :(得分:1)
您可以在适配器级别实现此目的。您将不得不使用这三种方法。
getItemViewType()
onCreateViewHolder()
onBindViewHolder()
这是一个帮助你的工作示例。让我知道是否有任何意义。只需将您的项目设为viewpager并添加多个项目页面即可。
https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView
答案 1 :(得分:0)
您可以拥有多个具有不同视图的视图持有者,因此可以根据类型使用不同的视图。