在网上搜了非常长时间。没有找到合适的Android三级菜单。所以就自己动手写了一个,主要使用了BaseExpandableList来实现,通过三个布局文件来完毕相应的菜单项,详细实现请參照下图。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpNDYzODUwNzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="300" height="600" alt="">

通过上面两图能够看出为三级菜单,每个菜单相应一个实体类,能够通过json解析数据载入进来,这里就只是多解释了。直接上源代码!

Activity实现类:

package com.zkq.activity;

import java.util.ArrayList;
import java.util.List; import com.example.teltest.R;
import com.zkq.model.FirstItem;
import com.zkq.model.SecondItem;
import com.zkq.model.ThirdItem; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.Toast; import com.zkq.adapter.*; public class MainActivity extends Activity {
private ExpandableListView listView;
private List<FirstItem> firstList;
private ExpandableListAdapter eAdpater; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
} private void initView() {
// TODO Auto-generated method stub
listView = (ExpandableListView) findViewById(R.id.expandList);
firstList = new ArrayList<FirstItem>();
} private void initData() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
FirstItem firstItem = new FirstItem();
firstItem.setId(i);
firstItem.setTitle("这是第" + i + "个");
List<SecondItem> seList = new ArrayList<SecondItem>();
for (int j = i; j < 10; j++) {
SecondItem secondItem = new SecondItem();
secondItem.setId(i);
secondItem.setTitle("子的第" + j * 78 + "条");
seList.add(secondItem);
List<ThirdItem> thirdList = new ArrayList<ThirdItem>();
for (int k = 0; k < j + 1; k++) {
ThirdItem thirdItem = new ThirdItem();
thirdItem.setId(k);
thirdItem.setImage("sss");
thirdItem.setName("张凯强" + k + j);
thirdItem.setTel("10086" + j + k);
thirdList.add(thirdItem);
}
secondItem.setThirdItems(thirdList);
}
firstItem.setSecondItems(seList);
firstList.add(firstItem);
}
eAdpater = new ExpandAdapter(MainActivity.this, firstList,stvClickEvent);
listView.setAdapter(eAdpater);
listView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View view,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,
childPosition + "---ccc===" + groupPosition,
Toast.LENGTH_LONG).show();
return false;
}
});
} OnChildClickListener stvClickEvent = new OnChildClickListener() { @Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
String msg = "parent_id = " + groupPosition + " child_id = "
+ childPosition;
Toast.makeText(MainActivity.this, msg,
Toast.LENGTH_SHORT).show();
return false;
}
}; @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

两个Adapter:

package com.zkq.adapter;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.Toast; import com.example.teltest.R;
import com.zkq.model.FirstItem;
import com.zkq.model.SecondItem;
import com.zkq.util.Constants; public class ExpandAdapter extends BaseExpandableListAdapter { private Context context;
private List<FirstItem> firstList;
private OnChildClickListener stvClickEvent;//外部回调函数
// private List<SecondItem> secondList; public ExpandAdapter(Context context, List<FirstItem> firstList,OnChildClickListener stvClickEvent) {
// TODO Auto-generated constructor stub
this.context = context;
this.firstList = firstList;
this.stvClickEvent=stvClickEvent;
// this.secondList = secondList;
} @Override
public Object getChild(int groupPosition, int childPosition) {
return firstList.get(groupPosition).getSecondItems();
} @Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
} @Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ExpandableListView treeView = getExpandableListView(firstList.get(groupPosition).getSecondItems().size());
ExpandAdapter2 expandAdapter2 = new ExpandAdapter2(context, firstList,
childPosition, groupPosition,treeView,stvClickEvent);
//treeView.setOnChildClickListener(stvClickEvent);
treeView.setAdapter(expandAdapter2);
return treeView;
} public ExpandableListView getExpandableListView(int position) {
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, Constants.SECOND_ITEM_HEIGHT*position);
ExpandableListView superTreeView = new ExpandableListView(context);
superTreeView.setLayoutParams(params);
return superTreeView;
} @Override
public int getChildrenCount(int position) {
// TODO Auto-generated method stub
return 1;
} @Override
public Object getGroup(int position) {
// TODO Auto-generated method stub
return firstList.get(position);
} @Override
public int getGroupCount() {
// TODO Auto-generated method stub
return firstList.size();
} @Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
} @Override
public View getGroupView(int position, boolean flag, View convertView,
ViewGroup group) {
// TODO Auto-generated method stub
FirstHolder holder = null;
if (convertView == null) {
holder = new FirstHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.first_lay, null);
holder.first_arrow = (ImageView) convertView
.findViewById(R.id.first_arrow);
holder.first_image = (ImageView) convertView
.findViewById(R.id.first_image);
holder.first_title = (TextView) convertView
.findViewById(R.id.first_title);
convertView.setTag(holder);
} else {
holder = (FirstHolder) convertView.getTag();
}
FirstItem firstItem = firstList.get(position);
holder.first_title.setText(firstItem.getTitle());
return convertView;
} @Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
} @Override
public boolean isChildSelectable(int arg0, int arg1) {
// TODO Auto-generated method stub
return true;
}
} class FirstHolder {
TextView first_title;
ImageView first_image;
ImageView first_arrow;
} class SecondHolder {
TextView second_title;
ImageView second_arrow;
}
package com.zkq.adapter;

import java.util.List;

import com.example.teltest.R;
import com.zkq.activity.MainActivity;
import com.zkq.model.FirstItem;
import com.zkq.model.SecondItem;
import com.zkq.model.ThirdItem;
import com.zkq.util.Constants; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.AbsListView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.ImageView;
import android.widget.TextView; public class ExpandAdapter2 extends BaseExpandableListAdapter { private Context context;
private List<FirstItem> firstList; private int cpostion;
private int gposition;
private ExpandableListView treeView;
private OnChildClickListener stvClickEvent;//外部回调函数
private int secondlength; // private List<SecondItem> secondList; public ExpandAdapter2(Context context, List<FirstItem> firstList,
int cposition, int gposition, ExpandableListView treeView,OnChildClickListener stvClickEvent) {
// TODO Auto-generated constructor stub
this.context = context;
this.firstList = firstList;
this.cpostion = cposition;
this.gposition = gposition;
this.treeView = treeView;
this.stvClickEvent=stvClickEvent;
// this.secondList = secondList;
} @Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return firstList.get(gposition).getSecondItems().get(groupPosition)
.getThirdItems().get(childPosition);
} public long getChildId(int groupPosition, int childPosition) {
return childPosition;
} @Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ThirdViewHolder childViewHolder = null;
if (convertView == null) {
childViewHolder = new ThirdViewHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.third_lay, null);
childViewHolder.third_name = (TextView) convertView
.findViewById(R.id.third_name);
childViewHolder.third_image = (ImageView) convertView
.findViewById(R.id.third_image);
childViewHolder.third_tel = (TextView) convertView
.findViewById(R.id.third_tel);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ThirdViewHolder) convertView.getTag();
}
ThirdItem thirdItem = firstList.get(gposition).getSecondItems()
.get(groupPosition).getThirdItems().get(childPosition);
childViewHolder.third_name.setText(thirdItem.getName());
childViewHolder.third_tel.setText(thirdItem.getTel());
//获取选中的内容
treeView.setOnChildClickListener(new OnChildClickListener() { @Override
public boolean onChildClick(ExpandableListView arg0, View arg1, int groupPosition,
int childPosition, long arg4) {
// TODO Auto-generated method stub
String msg = "-ppp--"+gposition+"parent_id = " + groupPosition + " child_id = "
+ childPosition;
Toast.makeText(context, msg,
Toast.LENGTH_SHORT).show();
return false;
}
});
return convertView;
} @Override
public int getChildrenCount(int position) {
// TODO Auto-generated method stub
return firstList.get(gposition).getSecondItems().get(position)
.getThirdItems().size();
} @Override
public Object getGroup(int groupPosition) {
return firstList.get(gposition).getSecondItems().get(groupPosition);
} @Override
public int getGroupCount() {
// TODO Auto-generated method stub
return firstList.get(gposition).getSecondItems().size();
} @Override
public long getGroupId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getGroupView(int position, boolean arg1, View convertView,
ViewGroup arg3) {
SecondHolder childViewHolder = null;
if (convertView == null) {
childViewHolder = new SecondHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.second_lay, null);
childViewHolder.second_title = (TextView) convertView
.findViewById(R.id.second_title);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (SecondHolder) convertView.getTag();
}
SecondItem secondItem = firstList.get(gposition).getSecondItems()
.get(position);
childViewHolder.second_title.setText(secondItem.getTitle());
/***
* 展开监听
*/
treeView.setOnGroupExpandListener(new OnGroupExpandListener() {
@Override
public void onGroupExpand(int position) {
// TODO Auto-generated method stub if (treeView.getChildCount() == firstList.get(gposition)
.getSecondItems().size()) {
if (secondlength > 0) {
secondlength += firstList.get(gposition)
.getSecondItems().get(position).getThirdItems()
.size()
* Constants.THIRD_ITEM_HEIGHT;
} else {
secondlength += firstList.get(gposition)
.getSecondItems().size()
* Constants.SECOND_ITEM_HEIGHT
+ firstList.get(gposition).getSecondItems()
.get(position).getThirdItems().size()
* Constants.THIRD_ITEM_HEIGHT;
}
} else {
secondlength += firstList.get(gposition).getSecondItems()
.get(position).getThirdItems().size()
* Constants.THIRD_ITEM_HEIGHT;
}
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, secondlength);
treeView.setLayoutParams(lp);
}
});
// treeView.setOnGroupClickListener(new OnGroupClickListener() {
// @Override
// public boolean onGroupClick(ExpandableListView arg0, View arg1,
// int position, long arg3) {
// // TODO Auto-generated method stub
// return false;
// }
// });
/***
* 缩放监听
*/
treeView.setOnGroupCollapseListener(new OnGroupCollapseListener() { @Override
public void onGroupCollapse(int position) {
// TODO Auto-generated method stub secondlength -= firstList.get(gposition).getSecondItems()
.get(position).getThirdItems().size()
* Constants.THIRD_ITEM_HEIGHT;
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, secondlength);
treeView.setLayoutParams(lp);
}
});
return convertView;
} @Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
} @Override
public boolean isChildSelectable(int arg0, int arg1) {
// TODO Auto-generated method stub
return true;
} class ThirdViewHolder {
ImageView third_image;
TextView third_name;
TextView third_tel;
} class SecondViewHolder {
TextView second_title;
ImageView second_arrow;
} }

以下时三个实体类:

package com.zkq.model;

import java.util.List;

public class FirstItem {
private int id;
private String title;
private String image;
private List<SecondItem> secondItems; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getImage() {
return image;
} public void setImage(String image) {
this.image = image;
} public List<SecondItem> getSecondItems() {
return secondItems;
} public void setSecondItems(List<SecondItem> secondItems) {
this.secondItems = secondItems;
} }
package com.zkq.model;

import java.util.List;

public class SecondItem {
private int id;
private String title;
private List<ThirdItem> thirdItems; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public List<ThirdItem> getThirdItems() {
return thirdItems;
} public void setThirdItems(List<ThirdItem> thirdItems) {
this.thirdItems = thirdItems;
} }
package com.zkq.model;

public class ThirdItem {
private int id;
private String name;
private String tel;
private String image;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
} }

常量

package com.zkq.util;

public class Constants {
/**
* 第二级和第三级菜单的高度
*/
public static final int SECOND_ITEM_HEIGHT=115;
public static final int THIRD_ITEM_HEIGHT=120;
}

最新文章

  1. ASP.net 页面生命周期
  2. PHP如何使用GeoIP数据库
  3. 依赖注入(DI)与服务容器(IoC)
  4. 初识mfc
  5. Integer与int的种种比较
  6. React学习一
  7. Magento后台界面全局样式修改之——font-weight
  8. Android 核心分析之十三Android GWES之Android窗口管理
  9. F. Igor and Interesting Numbers
  10. 快速集成图片浏览器快速集成图片浏览器-&gt;MJPhotoBrowser的使用
  11. java三种工厂模式
  12. URAL 1146 Maximum Sum(最大子矩阵的和 DP)
  13. JS 获取浏览器窗口大小clientWidth、offsetWidth、scrollWidth
  14. 从.net复制源代码中国农历阵列,必要做日历
  15. MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库【转载】
  16. 用Xamarin + VS 编写Android程序体验及其与Android Studio的比较
  17. nginx在 window下 自动退出 php-cgi
  18. 虚拟机Vmware成功安装Ubuntu Server 16.04中文版
  19. js基础--获取浏览器当前页面的滚动条高度的兼容写法
  20. python中 __init__.py的例程

热门文章

  1. python---连接MySQL第二页
  2. LINUX用户管理——/etc/passwd文件详解
  3. ERS卫星
  4. Realview MDK 中不用手动开中断的原因
  5. Mozilla推荐的CSS书写顺序
  6. Dialog 顶部黑线问题
  7. jQuery背景跟随鼠标移动的网页导航
  8. [置顶] 自娱自乐6之Linux gadget驱动5(自编gadget驱动,包涵与之通讯的主机usb驱动,已调试通过)
  9. [转载]解析WINDOWS中的DLL文件---经典DLL解读
  10. DML