多类型节点渲染RecyclerTreeView 如何同时展示文件夹与文件附完整代码【免费下载链接】RecyclerTreeViewTreeView implement in Android with RecyclerView.项目地址: https://gitcode.com/gh_mirrors/re/RecyclerTreeView在 Android 开发中如何在一个列表里既展示文件夹、又展示文件还要支持点击展开收起RecyclerTreeView 就是这样一个基于 RecyclerView 实现的轻量级树形列表控件它用「多类型节点渲染」机制优雅地解决了文件夹与文件混合展示的问题。本文将带你从原理到代码一步步看懂这个开源库的完整实现思路。什么是 RecyclerTreeView基于 RecyclerView 的 Android 树形列表控件RecyclerTreeView 的核心目标很纯粹TreeView implement in Android with RecyclerView即用官方推荐的 RecyclerView 来渲染树形结构。它没有引入复杂的自定义 ViewGroup而是把树节点拍平成列表数据交给 RecyclerView 复用与渲染性能自然有保障。它的核心库只有 4 个文件全部位于 recyclertreeview-lib 源码目录文件职责TreeNode.java树节点模型管理父子关系、展开状态TreeViewAdapter.java列表适配器把树拍平并处理展开收起动画TreeViewBinder.java节点绑定器抽象类对应 RecyclerView 的 ViewHolderLayoutItemType.java接口让每个数据 bean 返回自己的布局 id多类型节点渲染的核心原理布局 id 即类型标识多类型节点渲染的关键在于LayoutItemType接口。它只有一个方法getLayoutId()让每个数据类自己声明用哪个 item 布局public interface LayoutItemType { int getLayoutId(); }于是文件夹和文件两类节点天然区分开Dir返回文件夹布局File返回文件布局。适配器在getItemViewType()里直接取节点的布局 id 作为视图类型配合onCreateViewHolder按类型找到对应的 Binder就完成了多类型渲染的闭环相关逻辑见 TreeViewAdapter.java 的getItemViewType与onCreateViewHolder方法。完整实现步骤同时渲染文件夹与文件下面按 Demo 的写法见 MainActivity.java拆解 5 步完成一个文件管理器风格的树形列表。第一步定义文件夹与文件的数据模型两个 bean 都实现LayoutItemType分别绑定各自的布局Dir.java 实现文件夹节点返回R.layout.item_dirFile.java 实现文件节点返回R.layout.item_file第二步编写文件夹与文件的节点绑定器每个节点类型对应一个 Binder继承 TreeViewBinder.java。其中provideViewHolder对应 RecyclerView 的onCreateViewHolderbindView对应onBindViewHolder。文件夹 BinderDirectoryNodeBinder.java还会根据展开状态旋转箭头图标public class DirectoryNodeBinder extends TreeViewBinderDirectoryNodeBinder.ViewHolder { Override public ViewHolder provideViewHolder(View itemView) { return new ViewHolder(itemView); } Override public void bindView(ViewHolder holder, int position, TreeNode node) { holder.ivArrow.setRotation(node.isExpand() ? 90 : 0); Dir dirNode (Dir) node.getContent(); holder.tvName.setText(dirNode.dirName); holder.ivArrow.setVisibility(node.isLeaf() ? View.INVISIBLE : View.VISIBLE); } Override public int getLayoutId() { return R.layout.item_dir; } // ViewHolder 省略... }文件 BinderFileNodeBinder.java更简单只负责填充文件名即可。第三步用 TreeNode 组装树结构通过 TreeNode.java 的链式addChild方法几行代码就能拼出一棵目录树ListTreeNode nodes new ArrayList(); TreeNodeDir 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(TreeViewBinder))) ) ) ) );TreeNode 还内置了isLeaf()、isExpand()、expandAll()、collapseAll()、lock()等常用方法父子关系与层级深度由它统一管理。第四步把两类 Binder 一并交给 TreeViewAdapter这是多类型渲染最直观的一步把多个 Binder 一次性传给适配器列表自动按节点类型分发渲染TreeViewAdapter adapter new TreeViewAdapter( nodes, Arrays.asList(new FileNodeBinder(), new DirectoryNodeBinder()) ); rv.setLayoutManager(new LinearLayoutManager(this)); rv.setAdapter(adapter);第五步监听点击实现展开与收起通过setOnTreeNodeListener注册回调点击非叶子节点时切换展开状态并让箭头图标旋转 90 度动画效果丝滑adapter.setOnTreeNodeListener(new TreeViewAdapter.OnTreeNodeListener() { Override public boolean onClick(TreeNode node, RecyclerView.ViewHolder holder) { if (!node.isLeaf()) { onToggle(!node.isExpand(), holder); } return false; } Override public void onToggle(boolean isExpand, RecyclerView.ViewHolder holder) { ImageView ivArrow ((DirectoryNodeBinder.ViewHolder) holder).getIvArrow(); ivArrow.animate().rotationBy(isExpand ? 90 : -90).start(); } });展开收起背后是适配器用notifyItemRangeInserted/notifyItemRangeRemoved精确插入和移除子节点只刷新变化区域性能友好菜单里的「全部收起」则调用了collapseAll()。快速上手三步集成到你的项目引入依赖在根build.gradle添加jitpack仓库在 app 模块添加com.github.TellH:RecyclerTreeView:1.2.0示例见 README.md。照葫芦画瓢复制 Demo 中的Dir、File两个 bean 和两个 Binder替换成你自己的数据类型。组装树并设置适配器按上文第四、五步把TreeViewAdapter交给 RecyclerView 即可。如果只是想快速体验也可以直接git clone https://gitcode.com/gh_mirrors/re/RecyclerTreeView跑起自带 Demo对照 MainActivity.java 学习完整用法。结语多类型节点渲染其实很简单RecyclerTreeView 用「接口声明布局 Binder 分发渲染」的组合把 Android 树形列表的多类型节点渲染变得异常清晰数据类管布局、Binder 管视图、TreeNode 管结构、Adapter 管展开收起。无论你是要做文件管理器、组织架构树还是多级分类菜单这套思路都值得直接复用。动手改一改 Demo你的第一个多类型树形列表马上就能跑起来【免费下载链接】RecyclerTreeViewTreeView implement in Android with RecyclerView.项目地址: https://gitcode.com/gh_mirrors/re/RecyclerTreeView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考