自定義檢視,在 android 中實現帶圖示的可展開列表(ExpandableListActivity)
阿新 • • 發佈:2019-01-28
這個例子演示瞭如何自定義 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
[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