最近需要用到级联操作,一级菜单和二级菜单的显示,发现Android官方自带了一个控件,ExpandableListView,学了一下用法,还好比较简单,当然也要先写一个自定义的适配器去继承BaseExpandableListAdapter,并实现方法

public class MyAdapter extends BaseExpandableListAdapter{@Overridepublic int getGroupCount() {return 0;}@Overridepublic int getChildrenCount(int groupPosition) {return 0;}@Overridepublic Object getGroup(int groupPosition) {return null;}@Overridepublic Object getChild(int groupPosition, int childPosition) {return null;}@Overridepublic long getGroupId(int groupPosition) {return 0;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return 0;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubreturn null;}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {return null;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return false;}}
     一个个看,getGroupCount就是返回一级菜单的数目,getChildrenCount就是返回当前一级菜单下的二级菜单的数目,getGroup就是返回groupPosition所关联的data,getChild则是返回两个参数下关联的data,getGroupId直接返回groupPosition,getChildId如果没有要求也是直接返回childPosition,getGroupView和getChildView都是设置view显示的样子,可以在xml中自定义,也可以直接在代码中实例化。剩下的hasStableIds和isChildSelectable直接返回true就行。

    如果要展示的数据比较简单只有一项的话可以直接使用list集合,但是如果数据比较多,比如一个子view中同时显示内容和时间两个属性,就需要在list集合中嵌套一个map集合。在使用集合的时候要考虑将group的数据和child的数据关联起来,这样才能联动显示。先假设一个需求,比如qq的联系人界面,一级界面时好友分组,只有一个textview,二级界面做的简陋一点,一个imageview和一个textview,那么我们先开始写布局文件

res/layout/group.xml 一级菜单的布局

<?xml version="1.0" encoding="utf-8"?>    
res/layout/child.xml  二级菜单的布局

<?xml version="1.0" encoding="utf-8"?>                

在自定义的适配器中实例化

public class MyAdapter extends BaseExpandableListAdapter{private Context mContext;private List mGroups;private List>> mChilds;//构造函数中传入上下文对象,group的data,child的datapublic MyAdapter(Context context,List group,List>> child){this.mContext = context;this.mGroups = group;this.mChilds = child;}@Overridepublic int getGroupCount() {return mGroups.size();}@Overridepublic int getChildrenCount(int groupPosition) {return mChilds.get(groupPosition).size();}@Overridepublic Object getGroup(int groupPosition) {return mGroups.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {return mChilds.get(groupPosition).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {LinearLayout mLinearGroup = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.group, null);TextView grouptext = (TextView) mLinearGroup.findViewById(R.id.group_text);String text = mGroups.get(groupPosition);grouptext.setText(text);return mLinearGroup;}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {LinearLayout mLinearChild = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.child, null);ImageView childimg= (ImageView) mLinearChild.findViewById(R.id.child_img);Bitmap bitmap = (Bitmap) mChilds.get(groupPosition).get(childPosition).get("image");childimg.setImageBitmap(bitmap);TextView childtext = (TextView) mLinearChild.findViewById(R.id.child_txt);String text = (String) mChilds.get(groupPosition).get(childPosition).get("text");childtext.setText(text);return mLinearChild;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}}

然后在activity中进行调用

public class MainActivity extends Activity {private ExpandableListView mListView;private MyAdapter mAdapter;List group = null;List>> child = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ExpandableListView) findViewById(R.id.expand);initData();mAdapter = new MyAdapter(getApplicationContext(), group, child);mListView.setAdapter(mAdapter);//mListView.setGroupIndicator(null);  //设置箭头消失}/** * 传入测试数据,实际获取方法类似 */private void initData() {group = new ArrayList();group.add("我的好友");group.add("我的家人");group.add("我的同学");Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);child = new ArrayList>>();for (int i = 0; i < group.size(); i++) {List> lists = new ArrayList>();for (int j = 0; j < 6; j++) {Map map = new HashMap();map.put("image",bitmap );map.put("text", group.get(i)+j);lists.add(map);}child.add(lists);}}}

效果如下:

Android中级联列表ExpandableListView使用_第1张图片
源码下载链接:http://download.csdn.net/detail/u013926110/8973617


更多相关文章

  1. Android 中解析JSON形式的数据
  2. Android应用程序组件Content Provider的共享数据更新通知机制分
  3. android菜单的使用
  4. Android SQLite数据库升级的问题
  5. LinearLayout(线性布局)
  6. Android UI测量、布局、绘制过程探究
  7. 【Android】自定义dialog的布局样式
  8. 使用SharedPreferences存储和读取数据

随机推荐

  1. android studio 获取SHA1(指纹)
  2. Android(安卓)https ssl证书配置(使用okht
  3. Android(安卓)OpenGL ES学习笔记之绘制点
  4. 我把阿里、腾讯、字节跳动、美团等Androi
  5. Android(安卓)实现用户列表信息的功能,然
  6. 物联网温湿度显示控制项目(网页、Android
  7. Android--多线程之Handler
  8. 【Android】Android中使用JNI调用底层C++
  9. 手把手教你学Android(基础篇)
  10. (Android(安卓)studio)关于drawable文件夹