如何在回收站视图中显示嵌套(或'树')数据?

时间:2015-10-21 11:32:38

标签: android android-recyclerview

我有一个数据结构,其中每个节点可以包含n个相同类型的子节点。我希望将这些显示为每个孩子按照其深度"列出的列表。我已经有一个工作的回收站视图,显示顶级节点。我将如何继续展示子节点?

节点类看起来像这样:

public class Node
{
    private ArrayList<Node> children = new ArrayList<Node>();
    private String name;

    public Node(String name)
    {
        this.name = name;
    }

    public void addChild(Node node)
    {
        this.children.add(node);
    }

    public ArrayList<Node> getChildren()
    {
        return this.children;
    }

    public String getName()
    {
        return this.name;
    }
}

基本上,我想要的结果是这样的:

Node A
    Node A's Child A
    Node A's Child B
Node B
    Node B's Child A
        Node B's Child A's Child A
        Node B's Child A's Child B
    Node B's Child B
        Node B's Child B's Child A
Node C

1 个答案:

答案 0 :(得分:2)

您好这可能为时已晚,但我仍然发现解决方案可能对您和其他人有帮助

并感谢 TellH 提供精美的图书馆

  

https://github.com/TellH/RecyclerTreeView

  • 创建一个Java bean类并实现LayoutItemType,以将项目布局ID附加到它上面。

    public class Dir implements LayoutItemType {
        public String dirName;
    
        public Dir(String dirName) {
            this.dirName = dirName;
        }
    
        @Override
        public int getLayoutId() {
          return R.layout.item_dir;
      }
    

    }

  • 创建一个ViewBinder以将视图与数据bean绑定。如您所见,provideViewHolder(View itemView)对应于RecyclerView中的onCreateViewHolder,而bindView对应于RecyclerView中的onBindViewHolder。

    public class FileNodeBinder extends    TreeViewBinder<FileNodeBinder.ViewHolder> {
      @Override
      public ViewHolder provideViewHolder(View itemView) {
        return new ViewHolder(itemView);
      }
    
      @Override
      public void bindView(ViewHolder holder, int position, TreeNode node) {
         File fileNode = (File) node.getContent();
         holder.tvName.setText(fileNode.fileName);
      }
    
      @Override
      public int getLayoutId() {
          return R.layout.item_file;
      }
    
      public class ViewHolder extends TreeViewBinder.ViewHolder {
        public TextView tvName;
    
        public ViewHolder(View rootView) {
           super(rootView);
           this.tvName = (TextView) rootView.findViewById(R.id.tv_name);
       }
      }
    }
    
  • 将TreeNode添加到TreeViewAdapter。

      List<TreeNode> nodes = new ArrayList<>();
        TreeNode<Dir> app = new TreeNode<>(new Dir("app"));
        nodes.add(app);
        app.addChild(
                new TreeNode<>(new Dir("manifests"))
                        .addChild(new TreeNode<>(new     File("AndroidManifest.xml")))
        );
    
         app.addChild(
            new TreeNode<>(new Dir("java")).addChild(
                    new TreeNode<>(new Dir("tellh")).addChild(
                            new TreeNode<>(new Dir("com")).addChild(
                                    new TreeNode<>(new Dir("recyclertreeview"))
                                            .addChild(new TreeNode<>(new File("Dir")))
                                            .addChild(new TreeNode<>(new File("DirectoryNodeBinder")))
                                            .addChild(new TreeNode<>(new File("File")))
                                            .addChild(new TreeNode<>(new File("FileNodeBinder")))
                                            .addChild(new TreeNode<>(new File("TreeViewBinder")))
                            )
                    )
            )
    );
     TreeNode<Dir> res = new TreeNode<>(new Dir("res"));
        nodes.add(res);
        res.addChild(
                new TreeNode<>(new Dir("layout"))
                          .addChild(new TreeNode<>(new File("activity_main.xml")))
                        .addChild(new TreeNode<>(new File("item_dir.xml")))
                        .addChild(new TreeNode<>(new File("item_file.xml")))
        );
         res.addChild(
                new TreeNode<>(new Dir("mipmap"))
                    .addChild(new TreeNode<>(new File("ic_launcher.png")))
        );
        TreeViewAdapter adapter = new TreeViewAdapter(nodes,     Arrays.asList(new FileNodeBinder(), new DirectoryNodeBinder()));
        rv.setAdapter(adapter);
    
  • 将TreeNodeListener设置为TreeViewAdapter

    adapter.setOnTreeNodeListener(new TreeViewAdapter.OnTreeNodeListener() {
            @Override
            public boolean onClick(TreeNode node, RecyclerView.ViewHolder holder) {
                if (!node.isLeaf()) {
                    //Update and toggle the node.
                    onToggle(!node.isExpand(), holder);
                }
                return false;
            }
    
            @Override
            public void onToggle(boolean isExpand, RecyclerView.ViewHolder holder) {
                DirectoryNodeBinder.ViewHolder dirViewHolder = (DirectoryNodeBinder.ViewHolder) holder;
                final ImageView ivArrow = dirViewHolder.getIvArrow();
                int rotateDegree = isExpand ? 90 : -90;
               ivArrow.animate().rotationBy(rotateDegree)
                         .start();
            }
        });