Android ExpandableListView詳解

jopen 10年前發布 | 53K 次閱讀 Android Android開發 移動開發

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);//判斷此組是否展開</pre>

 expandableListView.setDivider();這個是設定每個Group之間的分割線。</p>

  expandableListView.setGroupIndicator();這個是設定每個Group之前的那個圖標。

  expandableListView.collapseGroup(int group); 將第group組收起

</span></span>

ExpandableListAdapter

一個接口,將基礎數據鏈接到一個ExpandableListView。 此接口的實施將提供訪問Child的數據(由組分類),并實例化的Child和Group。

1.重要方法</span></p>

    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);
}

}</pre>

運行效果:

注釋修改如下代碼:

 /-第一季-/
//        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));</pre> <p></p>

 運行效果:

★★★★★★★★★★★★★★★★★★★★

案例二:

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();   } } </pre>

     上面的樣式也可以使用系統的自帶的樣式如下:

    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]));
          }
      }
    

    }</pre>

    從上面的方法中可以看出 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]));
                              }                               
                      }
              }
      }
    

    }</pre>

     

     

     

    </span></span></span></span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!