android ListView 实现3级节点 (可拓展N级)

本文介绍了如何在Android中使用ListView实现三级菜单,避免了使用ExpandableListView带来的复杂性。通过点击事件触发数据更新,增删子节点数据,实现菜单的展开与收起。在Adapter中根据节点级别和状态定制每个ItemView的显示效果。
摘要由CSDN通过智能技术生成

            ListView实现二级节点想必大家都知道可以用ExpandableListView 就可以轻松实现,但是要实现3级甚至多级菜单怎么实现呢? 再利用ExpandableListView 就会十分繁琐,今天我们来探究另一种实现方式来实现。

          思路:每次点击展开子菜单 ,可以理解为 listView的一次重绘(数据更新<增加子节点数据>),而收起子菜单就是移除当前节点下的子数据,这是数据更新。对于界面每一个itemView的实现可以在adapter里面实现,根据没个子元素的级别,是否含有子节点,是否已经展开来配置不同的界面显示效果。首先来看实现的效果:


1:首先看子元素bean

package com.example.androidexpandablelistview;

import java.util.ArrayList;
import java.util.List;
/**
 * 元素 可根据需要添加新的属性 
 * @author jrh
 *
 */
public class TreeElement {
	/**
	 * 各个元素的层级标识
	 */
	private int parentLevel;
	/**
	 * 节点显示标题
	 */
	private String noteName;
	/**
	 * 子节点元素集合
	 */
	private ArrayList<TreeElement> dataList = new ArrayList<TreeElement>();
	/**
	 * 是否已扩展
	 */
	private boolean isExpandAble;
	/**
	 * 是否有子节点元素
	 */
	private boolean isHasChild;
	/**
	 * 当前节点位置
	 */
	private int position;

	/**
	 * 
	 * @param parentLevel 各个元素的层级标识
	 * @param noteName 节点显示标题
	 * @param dataList 子节点元素集合
	 * @param isExpandAble 是否已扩展
	 * @param isHasChild 是否有子节点元素
	 * @param position 当前节点位置
	 */

	public TreeElement(int parentLevel, String noteName,
			ArrayList<TreeElement> dataList, boolean isExpandAble,
			boolean isHasChild, int position) {
		super();
		this.parentLevel = parentLevel;
		this.noteName = noteName;
		this.dataList = dataList;
		this.isExpandAble = isExpandAble;
		this.isHasChild = isHasChild;
		this.position = position;
	}

	public int getPosition() {
		return position;
	}

	public void setPosition(int position) {
		this.position = position;
	}

	public boolean isHasChild() {
		return isHasChild;
	}

	public void setHasChild(boolean isHasChild) {
		this.isHasChild = isHasChild;
	}



	public int getParentLevel() {
		return parentLevel;
	}

	public void setParentLevel(int parentLevel) {
		this.parentLevel = parentLevel;
	}

	public String getNoteName() {
		return noteName;
	}

	public void setNoteName(String noteName) {
		this.noteName = noteName;
	}


	public ArrayList<TreeElement> getDataList() {
		return dataList;
	}

	public void setDataList(ArrayList<TreeElement> dataList) {
		this.dataList = dataList;
	}

	public boolean isExpandAble() {
		return isExpandAble;
	}

	public void setExpandAble(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
AndroidListView的二菜单可以通过嵌套ListView实现。具体步骤如下: 1. 创建一个主ListView并设置Adapter,Adapter中的数据包含一菜单的内容; 2. 给主ListView的每个item设置点击事件,在点击事件中创建一个子ListView并设置Adapter,Adapter中的数据包含二菜单的内容; 3. 将子ListView添加到主ListView的item中。 以下是一个简单的示例代码: ``` public class MainActivity extends AppCompatActivity { private ListView mListView; private List<String> mMainList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); } private void initData() { mMainList = new ArrayList<>(); mMainList.add("主菜单1"); mMainList.add("主菜单2"); mMainList.add("主菜单3"); } private void initView() { mListView = findViewById(R.id.listview_main); MainAdapter mainAdapter = new MainAdapter(); mListView.setAdapter(mainAdapter); } private class MainAdapter extends BaseAdapter { @Override public int getCount() { return mMainList.size(); } @Override public Object getItem(int position) { return mMainList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_main, parent, false); holder = new ViewHolder(); holder.tvMain = convertView.findViewById(R.id.tv_main); holder.lvSub = convertView.findViewById(R.id.lv_sub); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final String mainText = mMainList.get(position); holder.tvMain.setText(mainText); holder.tvMain.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SubAdapter subAdapter = new SubAdapter(); holder.lvSub.setAdapter(subAdapter); } }); return convertView; } } private static class ViewHolder { TextView tvMain; ListView lvSub; } private class SubAdapter extends BaseAdapter { private List<String> mSubList; public SubAdapter() { mSubList = new ArrayList<>(); mSubList.add("二菜单1"); mSubList.add("二菜单2"); mSubList.add("二菜单3"); } @Override public int getCount() { return mSubList.size(); } @Override public Object getItem(int position) { return mSubList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_sub, parent, false); } String subText = mSubList.get(position); TextView tvSub = convertView.findViewById(R.id.tv_sub); tvSub.setText(subText); return convertView; } } } ``` 其中,item_main.xml和item_sub.xml分别对应主ListView的item布局和子ListView的item布局,可以根据自己的需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值