1. 程式人生 > >自定義檢視,在 android 中實現帶圖示的可展開列表(ExpandableListActivity)

自定義檢視,在 android 中實現帶圖示的可展開列表(ExpandableListActivity)

這個例子演示瞭如何自定義 ExpandableListActivity 的樣式。效果如圖所示,group 條目由兩個 TextView 組成,child條目則由一個表示頭像的 ImageView,兩個表示名字和描述的 TextView,和最右側一個用於表示操作按扭的 ImageView

[img]http://hi.csdn.net/attachment/201104/14/0_1302742860Y9UD.gif[/img]

我突出主要程式碼,略掉了 xml,以讓你快速學會這個方法。


view plaincopy to clipboardprint?
public class Act1 extends ExpandableListActivity { //需要從ExpandableListActivity繼承
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main); //

Adapter1 ada=new Adapter1(); //Adapter1的定義下面,自定義檢視是由它實現的
setListAdapter(ada);
}

public class Adapter1 extends BaseExpandableListAdapter {

private String[] groups = //初始化一些資料用於顯示分組的標題,這個例子不是為了說明資料如何存取,所以這裡用固定資料,使例子更突出重點。
{
"g1",
"g2",
"g3",
};

private String[][] children = //初始化一些資料用於顯示每個分組下的資料項,這個例子不是為了說明資料如何存取,所以這裡用固定資料,使例子更突出重點。
{
{ "name1" },
{ "name21", "name21" },
{ "name31", "name32", "name33" },
};

@Override
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition]; //獲取資料,這裡不重要,為了讓例子完整,還是寫上吧
}

@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition; //
}

@Override
public int getChildrenCount(int groupPosition) {
return children[groupPosition].length; //
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
//重點在這裡
LayoutInflater inflate=LayoutInflater.from(Act1.this);
View view=inflate.inflate(R.layout.childlayout, null); //用childlayout這個layout作為條目的檢視

ImageView contactIcon=(ImageView)view.findViewById(R.id.contactIcon); //childlayout有一個圖示,
contactIcon.setImageResource(R.drawable.h001); //指定它的圖片內容,就是示例圖中的企鵝了

TextView name=(TextView)view.findViewById(R.id.name); //childlayout有一個用於顯示名字的檢視
name.setText(children[groupPosition][childPosition]); //給這個檢視資料

TextView description=(TextView)view.findViewById(R.id.description); //childlayout有一個用於顯示描述的檢視,在name檢視的下面,
description.setTextKeepState("description"); //這裡只是簡單的把它的資料設為description

ImageView mycursor=(ImageView)view.findViewById(R.id.myCursor);//childlayout還有一個小圖示,在右側,你可以給它一個單擊事件,以彈出對當前條目的選單。

return view;
}

@Override
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}

@Override
public int getGroupCount() {
return groups.length;
}

@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}

//父列表中的某一項的View
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
//這裡的處理方法和getChildView()裡的類似,不再重複說了

LayoutInflater inflate=LayoutInflater.from(Act1.this);
View view=inflate.inflate(R.layout.grouplayout, null); //用grouplayout這個layout作為條目的檢視

TextView groupName=(TextView)view.findViewById(R.id.groupName);
String group="test group";
groupName.setText(group);

TextView groupCount=(TextView)view.findViewById(R.id.groupCount);
groupCount.setText("["+children[groupPosition].length+"]");

return view;
}

@Override
public boolean hasStableIds() {
return true;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}

}
}

注:轉自:http://blog.csdn.net/zzzl/archive/2011/04/13/6321112.aspx