我有一个数据结构,其中每个节点可以包含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
答案 0 :(得分:2)
您好这可能为时已晚,但我仍然发现解决方案可能对您和其他人有帮助
并感谢 TellH 提供精美的图书馆
创建一个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();
}
});