zoukankan      html  css  js  c++  java
  • android ExpandableListView

    ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。

    重要方法:

    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);//判断此组是否展开

      expandableListView.setDivider();这个是设定每个Group之间的分割线。

      expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。

      expandableListView.collapseGroup(int group); 将第group组收起

    ExpandableListAdapter

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

    1.重要方法

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

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

    案例:

    首先定义个一个布局文件expandablelistview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
         <ExpandableListView
            android:id ="@+id/expandableListView"  
            android:layout_width ="fill_parent"  
            android:layout_height ="wrap_content"  
            >
         </ExpandableListView>
    </LinearLayout>
    package com.test;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.security.auth.PrivateCredentialPermission;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.widget.AbsListView;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.ExpandableListView;
    import android.widget.TextView;
     
    public class ExpandableListViewDemo extends Activity {
        /** Called when the activity is first created. */
         
        //定义两个List用来控制Group和Child中的String;
         
        private  List<String>  groupArray;//组列表
        private  List<List<String>> childArray;//子列表
        private  ExpandableListView  expandableListView_one;
         
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        requestWindowFeature(Window.FEATURE_NO_TITLE);  //设置为无标题  
            setContentView(R.layout.expandablelistview);
            expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);
            groupArray =new ArrayList<String>();
            childArray = new ArrayList<List<String>>();
            
            /*-第一季-*/
            initdate();
            expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
             
            /*-第二季-*/
    //        groupArray.add("移动开发");
    //        List<String> arrayList = new ArrayList<String>();
    //        arrayList.add("Android");
    //        arrayList.add("IOS");
    //        arrayList.add("Windows Phone");
    //        //组循环
    //        for(int index=0;index<groupArray.size();++index)
    //        {
    //          childArray.add(arrayList);
    //        }
    //        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
             
        }
        class ExpandableListViewaAdapter extends BaseExpandableListAdapter {
            Activity activity;
             public  ExpandableListViewaAdapter(Activity a)  
                {  
                    activity = a;  
                }  
           /*-----------------Child */
            @Override
            public Object getChild(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return childArray.get(groupPosition).get(childPosition);
            }
     
            @Override
            public long getChildId(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return childPosition;
            }
     
            @Override
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent) {
                 
                String string =childArray.get(groupPosition).get(childPosition);
                 
                return getGenericView(string);
            }
     
            @Override
            public int getChildrenCount(int groupPosition) {
                // TODO Auto-generated method stub
                return childArray.get(groupPosition).size();
            }
           /* ----------------------------Group */
            @Override
            public Object getGroup(int groupPosition) {
                // TODO Auto-generated method stub
                return getGroup(groupPosition);
            }
     
            @Override
            public int getGroupCount() {
                // TODO Auto-generated method stub
                return groupArray.size();
            }
     
            @Override
            public long getGroupId(int groupPosition) {
                // TODO Auto-generated method stub
                return groupPosition;
            }
     
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {
                 
               String   string=groupArray.get(groupPosition);
               return getGenericView(string);
            }
     
            @Override
            public boolean hasStableIds() {
                // TODO Auto-generated method stub
                return false;
            }
     
            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) 
            {
                // TODO Auto-generated method stub
                return true;
            }
             
            private TextView  getGenericView(String string ) 
            {
                  AbsListView.LayoutParams  layoutParams =new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
                   
                  TextView  textView =new TextView(activity);
                  textView.setLayoutParams(layoutParams);
                   
                  textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);
                   
                  textView.setPadding(40, 0, 0, 0);
                  textView.setText(string);
                  return textView;
             }
        }
         
        private void initdate() 
        {
            addInfo("语言", new String[]{"Oracle","Java","Linux","Jquery"});
            addInfo("男人的需求", new String[]{"金钱","事业","权力","女人","房子","",""});
        }
        private void addInfo(String group,String []child) {
             
            groupArray.add(group);
             
            List<String>  childItem =new ArrayList<String>();
             
            for(int index=0;index<child.length;index++)
            {
                childItem.add(child[index]);
            }
             childArray.add(childItem);
        }
    }

    运行效果:

    案例二:

    1.定义一个主界面expandablelistview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
         <ExpandableListView 
            android:id ="@+id/expandableListView"  
            android:layout_width ="fill_parent"  
            android:layout_height ="wrap_content"  
            >
         </ExpandableListView>
    </LinearLayout>

    2.在res/drawable目录下创建样式文件expandablelistview_groups.xml该界面是组界面:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
         <TextView
            android:id="@+id/textGroup"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:paddingLeft="40px"  
            android:paddingTop="6px"  
            android:paddingBottom="6px"  
            android:textSize="15sp"  
            android:text="No data"  
        >   
        </TextView>
    </LinearLayout>

    3.在res/drawable目录下创建样式文件expandablelistview_child.xml;是子控件,直接显示列表内容

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
         <TextView    
            android:id="@+id/textChild"  
            android:layout_width="fill_parent"   
            android:layout_height="fill_parent"   
            android:paddingLeft="60px"  
            android:paddingTop="10px"  
            android:paddingBottom="10px"  
            android:textSize="20sp"  
            android:text="No Data" />  
    </LinearLayout>

    定义java文件:ExpandableListViewDemo_two.java

    package com.test;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.security.auth.PrivateCredentialPermission;
     
    import com.test.R;
    import com.test.ExpandableListViewDemo.ExpandableListViewaAdapter;
    import com.test.R.id;
    import com.test.R.layout;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.widget.AbsListView;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.ExpandableListView;
    import android.widget.SimpleExpandableListAdapter;
    import android.widget.TextView;
     
    public class ExpandableListViewDemo_two extends Activity {
        /** Called when the activity is first created. */  
        private  ExpandableListView  expandableListView_one;
        @Override  
        public void onCreate(Bundle savedInstanceState)   
        {   
            super.onCreate(savedInstanceState);   
            setContentView(R.layout.expandablelistview);   
            expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);   
            //创建二个一级条目标题    
            Map<String, String> title_1 = new HashMap<String, String>();   
            Map<String, String> title_2 = new HashMap<String, String>();   
                
            title_1.put("group", "移动开发");   
            title_2.put("group", "男人的需求");   
                
            //创建一级条目容器    
            List<Map<String, String>> gruops = new ArrayList<Map<String,String>>();   
                
            gruops.add(title_1);   
            gruops.add(title_2);   
                
            //创建二级条目内容    
                
            //内容一    
            Map<String, String> content_1 = new HashMap<String, String>();   
            Map<String, String> content_2 = new HashMap<String, String>();   
                
            content_1.put("child", "ANDROID");   
            content_2.put("child", "IOS");   
                
            List<Map<String, String>> childs_1 = new ArrayList<Map<String,String>>();   
            childs_1.add(content_1);   
            childs_1.add(content_2);   
                
            //内容二    
            Map<String, String> content_3 = new HashMap<String, String>();   
            Map<String, String> content_4 = new HashMap<String, String>();  
            Map<String, String> content_5 = new HashMap<String, String>(); 
                
            content_3.put("child", "金钱");   
            content_4.put("child", "权力");   
            content_5.put("child", "女人"); 
            List<Map<String, String>> childs_2 = new ArrayList<Map<String,String>>();   
            childs_2.add(content_3);   
            childs_2.add(content_4);  
            childs_2.add(content_5); 
                
            //存放两个内容, 以便显示在列表中    
            List<List<Map<String, String>>> childs = new ArrayList<List<Map<String,String>>>();   
            childs.add(childs_1);   
            childs.add(childs_2);   
                
            //创建ExpandableList的Adapter容器    
    /**  
    * 使用SimpleExpandableListAdapter显示ExpandableListView  
    * 参数1.上下文对象Context  
    * 参数2.一级条目目录集合  
    * 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件 
    * 参数4.fromto,就是map中的key,指定要显示的对象  
    * 参数5.与参数4对应,指定要显示在groups中的id  
    * 参数6.二级条目目录集合  
    * 参数7.二级条目对应的布局文件  
    * 参数9.与参数8对应,指定要显示在childs中的id  
    /           SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(   
                    this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup},    
                    childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild}   
                    );   
                
            //加入列表    
            expandableListView_one.setAdapter(adapter); 
         expandableListView_one.setOnChildClickListener(listener);
        }   
        private OnChildClickListener  listener =new OnChildClickListener() {
       @Override
      public boolean onChildClick(ExpandableListView parent, View v,
        int groupPosition, int childPosition, long id) {
       // TODO Auto-generated method stub
       toast("点击了");
       return false;
      }
     };
     private void toast(String str) {
     Toast.makeText(this, str, Toast.LENGTH_LONG).show(); 
     } 
    }

     上面的样式也可以使用系统的自带的样式如下:

    android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义  

    android.R.layout.simple_expandable_list_item_2,  

    运行效果:

    案例三:如果group中有个ImageVIew将会是什么情况呢?

    在SimpleExpandableListAdapter中有如下方法:

    private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
            int len = to.length;
     
            for (int i = 0; i < len; i++) {
                TextView v = (TextView)view.findViewById(to[i]);
                if (v != null) {
                    v.setText((String)data.get(from[i]));
                }
            }
        }

    从上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都当成TextView来处理了,而不像SimpleAdapter可以自动判断View的类型,自动绑定,解决版本就是重写bingview回调一下试试:

    public class MyExpandableListAdapter extends BaseExpandableListAdapter{
            private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
                    int len = to.length;
                    boolean isBound = false;
                    for (int i = 0; i < len; i++) {
                       final View v = view.findViewById(to[i]);
                     if (v!=null) {
                    final Object _data = data.get(from[i]);
                    String text = _data == null ? "" : data.toString();
                    if (text == null) {
                        text = "";
                    }
                              if (mViewBinder != null) {//如果Binder不为空,使用Binder进行处理
                                            isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);
                                    }
                                    if (!isBound) {//如果Binder跳过,使用原来的方法进行处理
                                            TextView _v = (TextView)v;
                                            _v.setText((String)data.get(from[i]));
                                    }                               
                            }
                    }
            }
    }
  • 相关阅读:
    MSDN仿站
    跟我学android—02.CustomActivity
    iptables redirect outside requests to 127.0.0.1
    linux 查看端口使用情况
    防火墙、Iptables、netfilter/iptables、NAT 概述
    POSTROUTING与PREROUTING区别
    android:layout_gravity和android:gravity的区别
    EasyUI datagrid 分页Json字符串格式
    [转载]easyui datagrid 时间格化(JS 日期时间本地化显示)
    [转载]EasyUI Pagination 分页的两种做法
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4216281.html
Copyright © 2011-2022 走看看