繁体   English   中英

具有任何深度的嵌套项目的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM