android学习笔记(31)可展开的列表组件(ExpandableListView )

2014-12-30 17:42:37     人阅读    

         ExpandableListView是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。
         ExpandableListView的用法与普通ListView的用法非常相似,只是ExpandableListView所M不的列表项应该ExpandableAdapter提供。表2.18显示了 ExpandableListView所额外支持的常用XML属性。


表2.18 ExpandableListView所额外支持的常用XML属性
XML厲性                                                     说 明
androidxhildDivider                             指定各组内各子列表项之间的分隔条
androidichildlndicator                          显示在子列表项旁边的Drawable对象
android:groupIndicator                      显示在组列表项旁边的Drawable对象


       下面的程序示范了如何通过自定义ExpandableAdapter为ExpandableListView提供列表项。 该程序的界面布局文件非常简单,只是在LinearLayout内定义了一个ExpandableListView,因此此处不再给出。

程序清单:ExpandableListViewTest\src\org\crazyit\listview\ExpandableList Vie wTest.java

package org.crazyit.listview;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ExpandableListViewTest extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //创建一个BaseExpandableListAdapter对象
  ExpandableListAdapter adapter = new BaseExpandableListAdapter()
  {
   int[] logos = new int[]
   {
    R.drawable.p,
    R.drawable.z,
    R.drawable.t
   };
    private String[] armTypes = new String[]
    { "神族兵种", "虫族兵种", "人族兵种"};
   private String[][] arms = new String[][]
   {
    { "狂战士", "龙骑士", "黑暗圣堂", "电兵" },
    { "小狗", "刺蛇", "飞龙", "自爆飞机" },
    { "机枪兵", "护士MM" , "幽灵" }
   };
   //获取指定组位置、指定子列表项处的子列表项数据
   @Override
   public Object getChild(int groupPosition, int childPosition)
   {
    return arms[groupPosition][childPosition];
   }
   @Override
   public long getChildId(int groupPosition, int childPosition)
   {
    return childPosition;
   }
   @Override
   public int getChildrenCount(int groupPosition)
   {
    return arms[groupPosition].length;
   }
   private TextView getTextView()
   {
    AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, 64);
    TextView textView = new TextView(ExpandableListViewTest.this);
    textView.setLayoutParams(lp);
    textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    textView.setPadding(36, 0, 0, 0);
    textView.setTextSize(20);
    return textView;
   }
   //该方法决定每个子选项的外观
   @Override
   public View getChildView(int groupPosition, int childPosition,
     boolean isLastChild, View convertView, ViewGroup parent)
   {
    TextView textView = getTextView();   
    textView.setText(getChild(groupPosition, childPosition).toString());
    return textView;
   }
   //获取指定组位置处的组数据
   @Override
   public Object getGroup(int groupPosition)
   {
    return armTypes[groupPosition];
   }
   @Override
   public int getGroupCount()
   {
    return armTypes.length;
   }
   @Override
   public long getGroupId(int groupPosition)
   {
    return groupPosition;
   }
   //该方法决定每个组选项的外观
   @Override
   public View getGroupView(int groupPosition, boolean isExpanded,
     View convertView, ViewGroup parent)
   {
    LinearLayout ll = new LinearLayout(ExpandableListViewTest.this);
    ll.setOrientation(0);
    ImageView logo = new ImageView(ExpandableListViewTest.this);
    logo.setImageResource(logos[groupPosition]);
    ll.addView(logo);
    TextView textView = getTextView();
    textView.setText(getGroup(groupPosition).toString());    
    ll.addView(textView);   
    return ll;
   }
   @Override
   public boolean isChildSelectable(int groupPosition, int childPosition)
   {
    return true;
   }
   @Override
   public boolean hasStableIds()
   {
    return true;
   }
  };
  ExpandableListView expandListView = (ExpandableListView)
   findViewById(R.id.list);
  expandListView.setAdapter(adapter);
 }
}
        ExpandableListView expandListView = (ExpandableListView) findViewByld(R.id.list); expandListView.setAdapter(adapter);
      

           上面程序的关键代码就是提供开发者自己的Expandable List Adapter,当开发者实现自己的 ExpandableListAdapter 时,该组件内包括如下两个关键方法。
          getGroupView:该方法返回的View对象将作为组列表项。
         上面的程序中getChildView方法返回了一个普通 Text View,因为每个子列表项都是一个普通文本框•,而 getGroupView方法则返回了一个LinearLayout对象,该 LinearLayout 对象里包含一个 ImageView 和一个 TextView。 因此每个组列表项都由图片和文本组成。


            前面我们介绍过,上面ExpandableListView的每个子列表项都应该只是普通文本,那为 何从图2.44中可以看到每个子列表项左边都有一个图片呢?其实这是因为我们在定义\ExpandableListView时指定了 android:childIndicator="@drawable/ icon",它会自动在每个子列表项旁边添加一个图片。


原文地址:http://www.itmmd.com/201412/417.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android 更改三星手机软键盘的“next”按钮   上一篇
下一篇  android学习笔记(30)列表视图(ListView 和 ListActivity )
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!