android listview 多级树形列表
时间: 2023-09-14 07:11:21 浏览: 69
Android ListView 可以通过自定义适配器来实现多级树形列表。具体步骤如下:
1. 定义每个节点的数据模型,包括节点名称、节点ID、父节点ID等信息。
2. 自定义适配器,继承自 BaseAdapter,重写 getView() 方法,在该方法中根据节点的深度来确定每个节点的缩进距离,并根据节点状态显示不同的图标。
3. 在 Activity 的 onCreate() 方法中初始化树形数据,使用适配器将数据绑定到 ListView 上。
4. 在适配器中实现节点的展开和折叠功能,可以通过设置节点的可见性来实现。
5. 在 ListView 的 OnItemClickListener 中监听每个节点的点击事件,根据节点状态来判断是展开还是折叠。
示例代码如下:
1. 定义节点数据模型
```java
public class TreeNode {
private int nodeId;
private int parentId;
private String nodeName;
// 省略 getter 和 setter 方法
}
```
2. 自定义适配器
```java
public class TreeAdapter extends BaseAdapter {
private List<TreeNode> nodes;
private LayoutInflater inflater;
public TreeAdapter(Context context, List<TreeNode> nodes) {
this.nodes = nodes;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return nodes.size();
}
@Override
public Object getItem(int position) {
return nodes.get(position);
}
@Override
public long getItemId(int position) {
return nodes.get(position).getNodeId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.tree_item, null);
holder = new ViewHolder();
holder.icon = convertView.findViewById(R.id.icon);
holder.name = convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
TreeNode node = nodes.get(position);
holder.name.setText(node.getNodeName());
int level = getLevel(node);
holder.icon.setPadding(30 * (level + 1), holder.icon.getPaddingTop(),
holder.icon.getPaddingRight(), holder.icon.getPaddingBottom());
if (hasChildren(node)) {
holder.icon.setImageResource(node.isExpanded() ? R.drawable.icon_minus : R.drawable.icon_plus);
} else {
holder.icon.setImageResource(R.drawable.icon_node);
}
return convertView;
}
private int getLevel(TreeNode node) {
int level = 0;
while (node.getParentId() != 0) {
level++;
node = findNodeById(node.getParentId());
}
return level;
}
private boolean hasChildren(TreeNode node) {
for (TreeNode n : nodes) {
if (n.getParentId() == node.getNodeId()) {
return true;
}
}
return false;
}
private TreeNode findNodeById(int nodeId) {
for (TreeNode node : nodes) {
if (node.getNodeId() == nodeId) {
return node;
}
}
return null;
}
static class ViewHolder {
ImageView icon;
TextView name;
}
}
```
3. 初始化树形数据
```java
private void initTreeData() {
nodes = new ArrayList<>();
nodes.add(new TreeNode(1, 0, "Node 1"));
nodes.add(new TreeNode(2, 0, "Node 2"));
nodes.add(new TreeNode(3, 1, "Node 1-1"));
nodes.add(new TreeNode(4, 1, "Node 1-2"));
nodes.add(new TreeNode(5, 3, "Node 1-1-1"));
nodes.add(new TreeNode(6, 3, "Node 1-1-2"));
nodes.add(new TreeNode(7, 4, "Node 1-2-1"));
nodes.add(new TreeNode(8, 2, "Node 2-1"));
nodes.add(new TreeNode(9, 2, "Node 2-2"));
}
```
4. 实现节点展开和折叠功能
```java
private void toggleNode(int position) {
TreeNode node = nodes.get(position);
if (node.isExpanded()) {
collapseNode(node);
} else {
expandNode(node);
}
notifyDataSetChanged();
}
private void expandNode(TreeNode node) {
node.setExpanded(true);
for (TreeNode n : nodes) {
if (n.getParentId() == node.getNodeId()) {
n.setVisible(true);
}
}
}
private void collapseNode(TreeNode node) {
node.setExpanded(false);
for (TreeNode n : nodes) {
if (n.getParentId() == node.getNodeId()) {
n.setVisible(false);
collapseNode(n);
}
}
}
```
5. 监听节点点击事件
```java
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
toggleNode(position);
}
});
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)