Android之ExpandableListView下拉分组的实现

时间:2022-04-24
本文章向大家介绍Android之ExpandableListView下拉分组的实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

ExpandableListView是android中可以实现下拉list的一个控件,具体的实现方法如下:

首先:在layout的xml文件中定义一个ExpandableListView

<LinearLayout 
 android:id="@+id/linearLayout" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 androidrientation="vertical" 
 > 
 
 <ExpandableListView 
 android:id="@+id/expandableListView" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 /> 
</LinearLayout> 

定义两个List,用来存放控件中Group/Child中的String

private List<String> groupArray;  
private List<List<String>> childArray;  

对这两个List进行初始化,并插入一些数据

groupArray = new ArrayList<String>();  
childArray = new ArrayList<List<String>>();  
 
groupArray.add("第一行");  
groupArray.add("第二行");  
 
List<String> tempArray = new ArrayList<String>();  
tempArray.add("第一条");  
tempArray.add("第二条");  
tempArray.add("第三条");  
 
for(int index = 0; index <groupArray.size(); ++index)  
{  
    childArray.add(tempArray);  
}  

定义ExpandableListView的Adapter


//ExpandableListView的Adapter 
public class ExpandableAdapter extends BaseExpandableListAdapter  
{  
    Activity activity;  
 
 public ExpandableAdapter(Activity a)  
    {  
        activity = a;  
    }  
 public Object getChild(int groupPosition, int childPosition)  
    {  
 return childArray.get(groupPosition).get(childPosition);  
    }  
 public long getChildId(int groupPosition, int childPosition)  
    {  
 return childPosition;  
    }  
 public int getChildrenCount(int groupPosition)  
    {  
 return childArray.get(groupPosition).size();  
    }  
 public View getChildView(int groupPosition, int childPosition,  
 boolean isLastChild, View convertView, ViewGroup parent)  
    {  
        String string = childArray.get(groupPosition).get(childPosition);  
 return getGenericView(string);  
    }  
 // group method stub 
 public Object getGroup(int groupPosition)  
    {  
 return groupArray.get(groupPosition);  
    }  
 public int getGroupCount()  
    {  
 return groupArray.size();  
    }  
 public long getGroupId(int groupPosition)  
    {  
 return groupPosition;  
    }  
 public View getGroupView(int groupPosition, boolean isExpanded,  
            View convertView, ViewGroup parent)  
    {  
        String string = groupArray.get(groupPosition);  
 return getGenericView(string);  
    }  
 // View stub to create Group/Children 's View 
 public TextView getGenericView(String string)  
    {  
 // Layout parameters for the ExpandableListView 
        AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(  
                ViewGroup.LayoutParams.FILL_PARENT, 64);  
        TextView text = new TextView(activity);  
        text.setLayoutParams(layoutParams);  
 // Center the text vertically 
        text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  
 // Set the text starting position 
        text.setPadding(36, 0, 0, 0);  
        text.setText(string);  
 return text;  
    }  
 public boolean hasStableIds()  
    {  
 return false;  
    }  
 public boolean isChildSelectable(int groupPosition, int childPosition)  
    {  
 return true;  
    }  
}  

最后,给定义好的ExpandableListView添加上Adapter

ExpandableListView expandableListView = (ExpandableListView)findViewById(R.id.expandableListView);  
expandableListView.setAdapter(new ExpandableAdapter(Main.this));  

运行即可见效果~~~

----------------------------------------------------------------------------------------------------------------

Android版手风琴(ExpandableListView)

先看效果,过瘾一番。

 源码下载:http://files.cnblogs.com/salam/WidgetDemo.rar

  ExpandableListView是Android中的手风琴,本人感觉效果相当棒。

  一、ExpandableListView介绍

    一个垂直滚动的显示两个级别(Child,Group)列表项的视图,列表项来自ExpandableListAdapter 。组可以单独展开。

  1.重要方法

expandGroup(int groupPos) :在分组列表视图中展开一组,

setSelectedGroup(int groupPosition) :设置选择指定的组。

setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) :设置选择指定的子项。

getPackedPositionGroup(long packedPosition) :返回所选择的组

getPackedPositionForChild(int groupPosition, int childPosition) :返回所选择的子项

getPackedPositionType(long packedPosition) :返回所选择项的类型(Child,Group)

isGroupExpanded(int groupPosition) :判断此组是否展开

  2.代码:

ExpandableListContextMenuInfo menuInfo=(ExpandableListContextMenuInfo)item.getMenuInfo();
   String title=((TextView)menuInfo.targetView).getText().toString();
   int type=ExpandableListView.getPackedPositionType(menuInfo.packedPosition);
 
   if (type==ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
   int groupPos =ExpandableListView.getPackedPositionGroup(menuInfo.packedPosition);
   int childPos =ExpandableListView.getPackedPositionChild(menuInfo.packedPosition);

二、ExpandableListAdapter

一个接口,将基础数据链接到一个ExpandableListView。此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。

  1.重要方法

getChildId(int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。

getChildrenCount(int groupPosition) 返回在指定Group的Child数目。

  2.代码

 public class MyExpandableListAdapter extends BaseExpandableListAdapter {
          // Sample data set.  children[i] contains the children (String[]) for groups[i].
          public String[] groups = { "我的好友", "新疆同学", "亲戚", "同事" };
          public String[][] children = {
                  { "胡算林", "张俊峰", "王志军", "二人" },
                  { "李秀婷", "蔡乔", "别高", "余音" },
                  { "摊派新", "张爱明" },
                  { "马超", "司道光" }
          };
 
          public Object getChild(int groupPosition, int childPosition) {
              return children[groupPosition][childPosition];
          }
         public long getChildId(int groupPosition, int childPosition) {
              return childPosition;
          }
         public int getChildrenCount(int groupPosition) {
              return children[groupPosition].length;
          }
         public TextView getGenericView() {
              // Layout parameters for the ExpandableListView
              AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                      ViewGroup.LayoutParams.MATCH_PARENT, 64);
             TextView textView = new TextView(ExpandableListDemo.this);
              textView.setLayoutParams(lp);
              // Center the text vertically
              textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
              // Set the text starting position
              textView.setPadding(36, 0, 0, 0);
              return textView;
          }
 
          public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                  View convertView, ViewGroup parent) {
              TextView textView = getGenericView();
              textView.setText(getChild(groupPosition, childPosition).toString());
              return textView;
          }
         public Object getGroup(int groupPosition) {
              return groups[groupPosition];
          }
         public int getGroupCount() {
              return groups.length;
          }
         public long getGroupId(int groupPosition) {
              return groupPosition;
          }
         public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                  ViewGroup parent) {
              TextView textView = getGenericView();
              textView.setText(getGroup(groupPosition).toString());
              return textView;
          }
         public boolean isChildSelectable(int groupPosition, int childPosition) {
              return true;
          }
         public boolean hasStableIds() {
              return true;
          }
     }