![](/img/trans.png)
[英]Add items within nested list within nested recyclerview in a recyclerview
[英]Recyclerview with nested items of any depth
我需要显示一个可以有任意数量的副标题的 Recyclerview。 可悲的是,我只找到了支持深度为 1 的解决方案。 这对我的情况来说还不够。
我可以有这样的东西:
Heading 1
Subheading 1
Subsubheading 1
Subsubsubheading 1
Subheading 2
Heading 2
...
你明白了。 此外,如果用户可以像在 MS Word 中一样扩展这些标题及其内容,这也将非常有用。 如何实现这种行为(如果可能没有外部库)? 感谢您的支持!
对于这个问题,一个RecyclerView
应该就足够了。 您的Adapter
项目应该有一个包含节点深度和子节点的树结构。 然后,可以根据每个项目的深度填充其对应的视图进行更改。
让我们考虑一个简单的例子 - 有一个名为File
的数据 class 如下:
public class File {
...
public final List<File> children = new ArrayList();
public boolean isExpanded;
public boolean isFolder;
// THIS MUST BE NON-NEGATIVE
public int depth;
...
}
然后RecyclerView.Adapter
(最初你应该将根文件列表传递给它):
...
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
File file = files.get(position);
holder.itemView.setPadding(Math.min(depth, <MAX_PADDING>) * <leftPadding>, 0, <rightPadding>, 0);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (file.isFolder) {
if (!file.isExpanded) {
expand(holder, file);
} else {
// if you wanna collapse the folder then I'll leave it up to you :)
}
}
}
});
}
private void expand(ViewHolder holder, File file) {
file.isExpanded = true;
int start = holder.getAdapterPosition();
files.addAll(start + 1, file.children);
notifyItemRangeInserted(start + 1, file.children.size());
}
...
如果你想实现collapse
,那么它有点棘手(你必须计算应该从列表中删除的正确项目数),但我会留给你。
我最终使用了 user3170251 和我自己的方法的组合。 因为我的标头来自不同的模型,所以我使用了一个接口,所有模型都实现了该接口。
recyclerview 只获取实现该接口的对象列表。 通过检查当前元素的类型,它知道它是只读的 header 还是具有特殊点击功能的普通元素。 现在,要拥有某种层次结构,您需要将深度存储在 model 本身中。 因此,recyclerview 看到的数据层次结构仍然是一个平面列表,但是通过将深度保存在 model 本身中,我可以为深度更深的标题提供更小的字体大小。
Anshul Aggarwal 关于RecyclerView 是否有一个 addHeaderView 等价物的答案? 真的帮了我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.