TreeListView
Android 树形结构控件
Install / Use
/learn @hewenyuAndroid/TreeListViewREADME
TreeListView
Android 树形结构控件参考鸿洋大神的文章实现的树形结构功能;
效果图

引用方式
compile 'com.hewenyu:TreeView:1.0'
使用方式
- 在具体的项目的对象中标注Id和ParentId;
@TreeNodeId
private String Id;
@TreeNodeParentId
private String ParentId;
/**
* 在拿到数据后,计算ParentId
* 很多项目可能只给出了Id,ParentId需要自己计算,
* 这个可以根据不同的项目来进行不同的设置
*/
public void initParentId() {
String[] arr = getId().split("\\.");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length - 1; i++) {
sb.append(arr[i]);
sb.append(".");
}
ParentId = sb.toString();
}
- 正常流程设置适配器,在适配器中进行相对应的操作
mListView.setAdapter(
mAdapter = new TreeAdapter<TreeBean>(this, list, R.layout.adapter_tree_layout) {
@Override
protected void convert(TreeViewHolder holder, Node<TreeBean> node,
int position, ViewGroup parent) {
// 操作Item布局
holder.setText(R.id.tv_name, node.getRawData().getName());
// 设置选中的图标到具体的View
updateCheckedNodeIcon(holder, R.id.iv_checked, node,
R.drawable.icon_checked_circle, R.drawable.icon_unchecked_circle);
// 设置具体点击哪个View来操作选中事件
setCheckedNodeListener(holder, R.id.ll_convert_view, node);
// 设置展开/折叠的图标到具体的View
updateExpendOrCollapseIcon(holder, R.id.iv_arrow, node,
R.drawable.icon_tree_down, R.drawable.icon_tree_right);
// 设置具体点击哪个View来操作展开/折叠功能
setExpendOrCollapseListener(holder, R.id.iv_arrow, position);
}
});
- 设置默认选中的节点(可以省略)
// 设置默认选中的数据
Node<TreeBean> node = (Node<TreeBean>) mAdapter.getItem(0);
mAdapter.addCheckedNode(node);
- 监听选中的操作(自由定制单选/多选)
mAdapter.setOnItemCheckListener(new TreeAdapter.OnItemCheckListener<TreeBean>() {
@Override
public void onItemCheck(List<Node<TreeBean>> checkedNodes, Node<TreeBean> currentNode) {
// 多选 (3个)
if (checkedNodes.contains(currentNode)) {
checkedNodes.remove(currentNode);
} else {
if (checkedNodes.size() < 3) {
checkedNodes.add(currentNode);
} else {
Toast.makeText(mContext,
"最多只能选择 " + checkedNodes.size() + " 个",
Toast.LENGTH_SHORT).show();
}
}
// 单选
// if (checkedNodes.contains(currentNode)) {
// checkedNodes.remove(currentNode);
// } else {
// if (checkedNodes.isEmpty()) {
// checkedNodes.add(currentNode);
// } else {
// Toast.makeText(mContext,
// "当前已选: " + checkedNodes.get(0).getRawData().getName(),
// Toast.LENGTH_SHORT).show();
// }
// }
}
});
- 获取选中的节点的数据
// ListView中使用的是Node节点,原始的数据缓存在Node的RawData对象中
List<TreeBean> checkedNodes = mAdapter.getCheckedNodes().get(0).getRawData();
Related Skills
node-connect
344.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
96.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
344.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
344.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
