Android ApiDemos示例解析(112):Views->Expandable Lists->1. Custom Adapter

来源:互联网 发布:数据统计与分析与ai 编辑:程序博客网 时间:2024/05/07 13:50


 

Expandable List 与普通的List的区别在于Expandable List可以显示两个层次,第一层称为”Group” 第二层称为”Child” 。其中”Child”可以折叠或者展开,有点像只支持两級的TreeView(文件游览器)。

用法上和List 非常类似,下面的对应关系可以帮助理解Expandable List

  • ExpandableListActivity –>ListActivity
  • ExpandableListView –> ListView
  • ExpandableListAdapter –>ListAdapter

ExpandableListActivity 预设的Layout 為一居中全屏显示的列表(两级)。Android也允許使用自定义的Layout来显示Expandable List. 为了使用自定义的Layout的,在XML中必须包括一個ExpandableListView对象且id必须为 @android:id/list。 此外也可以为空列表定义一個View,此View的id为 @id/android:empty。

如下例为ExpandableListActivity 自定义一個Layout  ,为在列表为空时显示「No Data”.可以在onCreate 使用setContentView设置這個自定义Layout .

<?xml version=”1.0″ encoding=”UTF-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:paddingLeft=”8dp”
android:paddingRight=”8dp”>
<ExpandableListView android:id=”@id/android:list
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background=”#00FF00″
android:layout_weight=”1″
android:drawSelectorOnTop=”false”/>

<TextView android:id=”@id/android:empty
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background=”#FF0000″
android:text=”No data”/>
</LinearLayout>

ExpandableListActivity 调用setListAdapter(ExpandableListAdapter) 设置ExpandableListAdapter, ExpandableListAdapter 允许为”group” 和 “child”分別设置View。

例如本例 MyExpandableListAdapter 派生自BaseExpandableListAdapter,重载了getChildView 和getGroupView,分別为group 和child定义一個TextView,TextView的文本为Group名称或是Child的名称,分別对应在groups 和children。

1// Sample data set.  children[i] contains
2//the children (String[]) for groups[i].
3private String[] groups = { "People Names""Dog Names",
4 "Cat Names""Fish Names" };
5private String[][] children = {
6 "Arnold""Barry""Chuck""David" },
7 "Ace""Bandit""Cha-Cha""Deuce" },
8 "Fluffy""Snuggles" },
9 "Goldy""Bubbles" }
10};
11 
12public View getChildView(int groupPosition, int childPosition, booleanisLastChild,
13 View convertView, ViewGroup parent) {
14 TextView textView = getGenericView();
15 textView.setText(getChild(groupPosition, childPosition).toString());
16 return textView;
17}
18 
19 public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
20 ViewGroup parent) {
21 TextView textView = getGenericView();
22 textView.setText(getGroup(groupPosition).toString());
23 return textView;
24}

getExpandableListView() 取得当前Activity 对应的ExpandableListView, 然后调用registerForContextMenu 为 ExpandableListView 添加Context Menu.

然後在onContextItemSelected事件中为List View 中的每個list Item 添加事件,本例使用Toast 显示一行文本,显示当前点击的事件。

1public boolean onContextItemSelected(MenuItem item) {
2 ExpandableListContextMenuInfo info
3 = (ExpandableListContextMenuInfo) item.getMenuInfo();
4 
5 String title = ((TextView) info.targetView).getText().toString();
6 
7 int type = ExpandableListView.getPackedPositionType(info.packedPosition);
8 if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
9 int groupPos
10 = ExpandableListView.getPackedPositionGroup(info.packedPosition);
11 int childPos
12 = ExpandableListView.getPackedPositionChild(info.packedPosition);
13 Toast.makeText(this, title + ": Child " + childPos
14 " clicked in group " + groupPos,
15 Toast.LENGTH_SHORT).show();
16 return true;
17 else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
18 int groupPos
19 = ExpandableListView.getPackedPositionGroup(info.packedPosition);
20 Toast.makeText(this, title + ": Group " + groupPos
21 " clicked", Toast.LENGTH_SHORT).show();
22 return true;
23 }
24 
25 return false;
26}

 


原创粉丝点击