expandablelistview学习--在listView里面嵌套GridView

    转载自:http://blog.csdn.net/aomandeshangxiao/article/details/7163457#

 

 

    在网上看到一个例子,讲android中的expandablelistview,是一种可以扩展的listview,就是那种点击一下可以扩展出子项,再点一下收缩回去的显示list。因为需要查看一堆文件的目录结构,就使用了expandablelist以便于直观地看到结构形式。
顶层是group,第二层是child。实现ExpandableListView至少需要下面两个类。

        一、ExpandableListView
    一个垂直滚动的显示两个级别(Child,Group)列表项的视图,列表项来自ExpandableListAdapter 。组可以单独展开。
  其所用到的重要方法如下:
      

  1.             expandGroup(int groupPos) :在分组列表视图中展开一组,  
  2.       setSelectedGroup(int groupPosition) :设置选择指定的组。  
  3.       setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) :设置选择指定的子项。  
  4.       getPackedPositionGroup(long packedPosition) :返回所选择的组  
  5.       getPackedPositionForChild(int groupPosition, int childPosition) :返回所选择的子项  
  6.       getPackedPositionType(long packedPosition) :返回所选择项的类型(Child,Group)  
  7.       isGroupExpanded(int groupPosition) :判断此组是否展开  

       

  二、ExpandableListAdapter
    一个接口,将基础数据链接到一个ExpandableListView。此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。
  其里面重要方法

    

  1. getChildId(int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。  
  2.     getChildrenCount(int groupPosition) 返回在指定Group的Child数目。  
  3.         getChildView() 获取子视图(就是二级视图)  
  4.         getChildView()获取父视图  

当我们想做到自己的打开或者关闭的标记时,可以先设置一个selector.xml,然后再用ExpandableListView的实例去调用setGroupIndicator(this.getResources().getDrawable(R.drawable.expand_list_selector));  这样就可以了。

下面就看下例子:

这个代码好像也是在eoe上下载下来的,具体也记不太清楚了,先看下效果图:


先给下代码,人家写的,咱们学习下:

  1. public class ListViewActivity extends Activity  
  2. {  
  3.     ExpandableListView expandableListView;  
  4.   
  5.     ListViewAdapter treeViewAdapter;  
  6.   
  7.     public String[] groups = { "列表1""列表2""列表3" };  
  8.   
  9.     public String[][] child = { { "" }, { "" }, { """" } };  
  10.   
  11.     public void onCreate(Bundle savedInstanceState)  
  12.     {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.   
  16.         treeViewAdapter = new ListViewAdapter(this,  
  17.                 ListViewAdapter.PaddingLeft >> 1);  
  18.         expandableListView = (ExpandableListView) this  
  19.         .findViewById(R.id.expandableListView);  
  20.   
  21.         List<ListViewAdapter.TreeNode> treeNode = treeViewAdapter.GetTreeNode();  
  22.         for (int i = 0; i < groups.length; i++)  
  23.         {  
  24.             ListViewAdapter.TreeNode node = new ListViewAdapter.TreeNode();  
  25.             node.parent = groups[i];  
  26.             for (int ii = 0; ii < child[i].length; ii++)  
  27.             {  
  28.                 node.childs.add(child[i][ii]);  
  29.             }  
  30.             treeNode.add(node);  
  31.         }  
  32.   
  33.         treeViewAdapter.UpdateTreeNode(treeNode);  
  34.         expandableListView.setAdapter(treeViewAdapter);  
  35.     }  
  36.   
  37.       
  38. }  

GridView的定义:

  1. <pre name="code" class="java">class MyGridView extends GridView  
  2.     {  
  3.         public MyGridView(android.content.Context context,  
  4.                 android.util.AttributeSet attrs)  
  5.         {  
  6.             super(context, attrs);  
  7.         }  
  8.   
  9.         /** 
  10.          * 设置不滚动 
  11.          */  
  12.         public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
  13.         {  
  14.             int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
  15.             MeasureSpec.AT_MOST);  
  16.             super.onMeasure(widthMeasureSpec, expandSpec);  
  17.         }  
  18.     }  

adapter的代码:

 

  1. public class ListViewAdapter extends BaseExpandableListAdapter implements  
  2.         OnItemClickListener  
  3. {  
  4.     public static final int ItemHeight = 48;// 每项的高度   
  5.     public static final int PaddingLeft = 36;// 每项的高度   
  6.     private int myPaddingLeft = 0;  
  7.     private MyGridView toolbarGrid;  
  8.     private String menu_toolbar_name_array[] = { "存储卡""我的下载""图书导入""系统备份",  
  9.             "系统恢复""清除全部""在线升级""快速入门""关于开卷""退出系统""在线升级""快速入门",  
  10.             "关于开卷""退出系统""关于开卷""退出系统""关于开卷""退出系统""关于开卷""退出系统" };  
  11.     private int menu_toolbar_image_array[] = { R.drawable.icon_sdcard,  
  12.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  13.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  14.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  15.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  16.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  17.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  18.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  19.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  20.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  21.             R.drawable.icon_sdcard };  
  22.   
  23.     private List<TreeNode> treeNodes = new ArrayList<TreeNode>();  
  24.     private Context parentContext;  
  25.     private LayoutInflater layoutInflater;  
  26.     static public class TreeNode  
  27.     {  
  28.         Object parent;  
  29.         List<Object> childs = new ArrayList<Object>();  
  30.     }  
  31.   
  32.     public ListViewAdapter(Context view, int myPaddingLeft)  
  33.     {  
  34.         parentContext = view;  
  35.         this.myPaddingLeft = myPaddingLeft;  
  36.     }  
  37.   
  38.     public List<TreeNode> GetTreeNode()  
  39.     {  
  40.         return treeNodes;  
  41.     }  
  42.   
  43.     public void UpdateTreeNode(List<TreeNode> nodes)  
  44.     {  
  45.         treeNodes = nodes;  
  46.     }  
  47.   
  48.     public void RemoveAll()  
  49.     {  
  50.         treeNodes.clear();  
  51.     }  
  52.   
  53.     public Object getChild(int groupPosition, int childPosition)  
  54.     {  
  55.         return treeNodes.get(groupPosition).childs.get(childPosition);  
  56.     }  
  57.   
  58.     public int getChildrenCount(int groupPosition)  
  59.     {  
  60.         return treeNodes.get(groupPosition).childs.size();  
  61.     }  
  62.   
  63.     static public TextView getTextView(Context context)  
  64.     {  
  65.         AbsListView.LayoutParams lp = new AbsListView.LayoutParams(  
  66.                 ViewGroup.LayoutParams.FILL_PARENT, ItemHeight);  
  67.   
  68.         TextView textView = new TextView(context);  
  69.         textView.setLayoutParams(lp);  
  70.         textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  
  71.         return textView;  
  72.     }  
  73.   
  74.     /** 
  75.      * 可自定义ExpandableListView 
  76.      */  
  77.     public View getChildView(int groupPosition, int childPosition,  
  78.             boolean isLastChild, View convertView, ViewGroup parent)  
  79.     {  
  80.         if (convertView == null)  
  81.         {  
  82.             layoutInflater = (LayoutInflater) parentContext  
  83.                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  84.             convertView = layoutInflater.inflate(R.layout.view, null);  
  85.   
  86.             toolbarGrid = (MyGridView) convertView  
  87.                     .findViewById(R.id.GridView_toolbar);  
  88.             toolbarGrid.setNumColumns(4);// 设置每行列数   
  89.             toolbarGrid.setGravity(Gravity.CENTER);// 位置居中   
  90.             toolbarGrid.setHorizontalSpacing(10);// 水平间隔   
  91.             toolbarGrid.setAdapter(getMenuAdapter(menu_toolbar_name_array,  
  92.                     menu_toolbar_image_array));// 设置菜单Adapter   
  93.             toolbarGrid.setOnItemClickListener(this);  
  94.   
  95.         }  
  96.         return convertView;  
  97.     }  
  98.   
  99.     /** 
  100.      * 可自定义list 
  101.      */  
  102.     public View getGroupView(int groupPosition, boolean isExpanded,  
  103.             View convertView, ViewGroup parent)  
  104.     {  
  105.         TextView textView = getTextView(this.parentContext);  
  106.         textView.setText(getGroup(groupPosition).toString());  
  107.         textView.setPadding(myPaddingLeft + PaddingLeft, 000);  
  108.         return textView;  
  109.     }  
  110.   
  111.     public long getChildId(int groupPosition, int childPosition)  
  112.     {  
  113.         return childPosition;  
  114.     }  
  115.   
  116.     public Object getGroup(int groupPosition)  
  117.     {  
  118.         return treeNodes.get(groupPosition).parent;  
  119.     }  
  120.   
  121.     public int getGroupCount()  
  122.     {  
  123.         return treeNodes.size();  
  124.     }  
  125.   
  126.     public long getGroupId(int groupPosition)  
  127.     {  
  128.         return groupPosition;  
  129.     }  
  130.   
  131.     public boolean isChildSelectable(int groupPosition, int childPosition)  
  132.     {  
  133.         return true;  
  134.     }  
  135.   
  136.     public boolean hasStableIds()  
  137.     {  
  138.         return true;  
  139.     }  
  140.   
  141.     /** 
  142.      * 构造菜单Adapter 
  143.      *  
  144.      * @param menuNameArray 
  145.      *            名称 
  146.      * @param imageResourceArray 
  147.      *            图片 
  148.      * @return SimpleAdapter 
  149.      */  
  150.     private SimpleAdapter getMenuAdapter(String[] menuNameArray,  
  151.             int[] imageResourceArray)  
  152.     {  
  153.         ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();  
  154.         for (int i = 0; i < menuNameArray.length; i++)  
  155.         {  
  156.             HashMap<String, Object> map = new HashMap<String, Object>();  
  157.             map.put("itemImage", imageResourceArray[i]);  
  158.             map.put("itemText", menuNameArray[i]);  
  159.             data.add(map);  
  160.         }  
  161.         SimpleAdapter simperAdapter = new SimpleAdapter(parentContext, data,  
  162.                 R.layout.item_menu, new String[] { "itemImage""itemText" },  
  163.                 new int[] { R.id.item_image, R.id.item_text });  
  164.         return simperAdapter;  
  165.     }  
  166.   
  167.     @Override  
  168.     public void onItemClick(AdapterView<?> parent, View view, int position,  
  169.             long id)  
  170.     {  
  171.         Toast.makeText(parentContext, "当前选中的是:" + position, Toast.LENGTH_SHORT)  
  172.                 .show();  
  173.   
  174.     }  
  175. }  

里面比较简单的是listView,比较难的就是嵌套GridView吧!

定义文字和图片:

  1. <pre name="code" class="java">private String menu_toolbar_name_array[] = { "存储卡""我的下载""图书导入""系统备份",  
  2.             "系统恢复""清除全部""在线升级""快速入门""关于开卷""退出系统""在线升级""快速入门",  
  3.             "关于开卷""退出系统""关于开卷""退出系统""关于开卷""退出系统""关于开卷""退出系统" };  
  4.     private int menu_toolbar_image_array[] = { R.drawable.icon_sdcard,  
  5.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  6.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  7.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  8.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  9.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  10.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  11.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  12.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  13.             R.drawable.icon_sdcard, R.drawable.icon_sdcard,  
  14.             R.drawable.icon_sdcard };  

 

 

里面很重要的是那个node,一定要看理解:

  1. public List<TreeNode> GetTreeNode()  
  2.     {  
  3.         return treeNodes;  
  4.     }  
  5.   
  6.     public void UpdateTreeNode(List<TreeNode> nodes)  
  7.     {  
  8.         treeNodes = nodes;  
  9.     }  
  10.   
  11.     public void RemoveAll()  
  12.     {  
  13.         treeNodes.clear();  
  14.     }  
  15.   
  16.     public Object getChild(int groupPosition, int childPosition)  
  17.     {  
  18.         return treeNodes.get(groupPosition).childs.get(childPosition);  
  19.     }  
  20.   
  21.     public int getChildrenCount(int groupPosition)  
  22.     {  
  23.         return treeNodes.get(groupPosition).childs.size();  
  24.     }  
  25.       
  26.     public Object getGroup(int groupPosition)  
  27.     {  
  28.         return treeNodes.get(groupPosition).parent;  
  29.     }  
  30.   
  31.     public int getGroupCount()  
  32.     {  
  33.         return treeNodes.size();  
  34.     }  


adapter也挺简单:


  1. private SimpleAdapter getMenuAdapter(String[] menuNameArray,  
  2.             int[] imageResourceArray)  
  3.     {  
  4.         ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();  
  5.         for (int i = 0; i < menuNameArray.length; i++)  
  6.         {  
  7.             HashMap<String, Object> map = new HashMap<String, Object>();  
  8.             map.put("itemImage", imageResourceArray[i]);  
  9.             map.put("itemText", menuNameArray[i]);  
  10.             data.add(map);  
  11.         }  
  12.         SimpleAdapter simperAdapter = new SimpleAdapter(parentContext, data,  
  13.                 R.layout.item_menu, new String[] { "itemImage""itemText" },  
  14.                 new int[] { R.id.item_image, R.id.item_text });  
  15.         return simperAdapter;  
  16.     }  


代码下载地址如下:

http://download.csdn.net/detail/aomandeshangxiao/3986353

网上还有其他例子,可以一并学习下:

Android自定义ExpandableListView


用户界面View


Android版手风琴(ExpandableListView)


ExpandableListView使用及数据更新


用ExpandableListView实现类似QQ好友列表

  1. <p><span style="font-size:16px"></span></p><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre name="code" class="java" style="background-color: rgb(255, 255, 255); "><pre>  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值