7.20. ExpandableListView(树形组件)
需结合适配器BaseExpandableListAdapter完成。
示例:
配置:activity_expandable_list_view.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ExpandableListView android:id="@+id/elistview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> |
Activity:
package com.makyan.demo; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ExpandableListView.OnGroupClickListener; import android.widget.ExpandableListView.OnGroupCollapseListener; import android.widget.ExpandableListView.OnGroupExpandListener; import android.widget.Toast; public class ExpandableListViewActivity extends Activity { private ExpandableListView elistview = null; // 定义树型组件 private ExpandableListAdapter adapter = null; // 定义适配器对象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_expandable_list_view); // 默认布局管理器 elistview = (ExpandableListView) super.findViewById(R.id.elistview); // 取得组件 adapter = new MyExpandableListAdapter(this); // 实例化适配器 elistview.setAdapter(adapter); // 设置适配器 registerForContextMenu(elistview); // 注册上下文菜单 elistview.setOnChildClickListener(new OnChildClickListenerImpl()); // 设置子项单击事件 elistview.setOnGroupClickListener(new OnGroupClickListenerImpl()); // 设置组项单击事件 elistview.setOnGroupCollapseListener(new OnGroupCollapseListenerImpl()); // 关闭分组事件 elistview.setOnGroupExpandListener(new OnGroupExpandListenerImpl()); // 展开分组事件 } private class OnChildClickListenerImpl implements OnChildClickListener { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText( ExpandableListViewActivity.this, "子选项被选中,groupPosition = " + groupPosition + ",childPosition = " + childPosition, Toast.LENGTH_SHORT).show(); // 显示提示框 return false; } } private class OnGroupClickListenerImpl implements OnGroupClickListener { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { Toast.makeText(ExpandableListViewActivity.this, "分组被选中,groupPosition = " + groupPosition, Toast.LENGTH_SHORT).show(); // 显示提示框 return false; } } private class OnGroupCollapseListenerImpl implements OnGroupCollapseListener { @Override public void onGroupCollapse(int groupPosition) { Toast.makeText(ExpandableListViewActivity.this, "关闭分组,groupPosition = " + groupPosition, Toast.LENGTH_SHORT) .show(); // 显示提示框 } } private class OnGroupExpandListenerImpl implements OnGroupExpandListener { @Override public void onGroupExpand(int groupPosition) { Toast.makeText(ExpandableListViewActivity.this, "打开分组,groupPosition = " + groupPosition, Toast.LENGTH_SHORT) .show(); // 显示提示框 } } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; int type = ExpandableListView.getPackedPositionType(info.packedPosition); // 取得操作的菜单项 int group = ExpandableListView.getPackedPositionGroup(info.packedPosition); // 取得菜单项所在的菜单组 int child = ExpandableListView.getPackedPositionChild(info.packedPosition); // 取得子菜单项的索引 Toast.makeText(ExpandableListViewActivity.this, "type = " + type + ",group = " + group + ",child = " + child, Toast.LENGTH_SHORT).show(); // 显示提示框 } } |
Adapter:
package com.makyan.demo; import android.content.Context; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; // 继承BaseExpandableListAdapter并覆写类中的抽象方法 public class MyExpandableListAdapter extends BaseExpandableListAdapter { public String[] groups = { "我的好友", "家人", "同事", "黑名单" }; // 组名称 public String[][] children = { { "makyan", "二弟", "小武", "老板" }, { "父亲", "母亲" }, { "刘宏伟", "刘德华", "刘媛" }, { "票贩子", "造假商" } }; // 定义组项 private Context context = null; // 保存上下文对象 public MyExpandableListAdapter(Context context) { // 构造方法接收 this.context = context; } @Override public Object getChild(int groupPosition, int childPosition) { // 取得指定的子项 return this.children[groupPosition][childPosition]; } @Override public long getChildId(int groupPosition, int childPosition) { // 取得子项ID return childPosition; } public TextView buildTextView() { // 自定义方法,建立文本 AbsListView.LayoutParams param = new AbsListView.LayoutParams( ViewGroup.LayoutParams. TextView textView = new TextView(this.context); // 创建TextView textView.setLayoutParams(param); // 设置布局参数 textView.setTextSize(15.0f); // 设置文字大小 textView.setGravity(Gravity.LEFT); // 左对齐 textView.setPadding(40, 8, 3, 3); // 间距 return textView; // 返回组件 } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {// 返回子项组件 TextView textView = buildTextView(); // 创建TextView textView.setText(getChild(groupPosition, childPosition).toString()); // 设置显示文字 return textView; } @Override public int getChildrenCount(int groupPosition) { // 取得子项个数 return this.children[groupPosition].length; // 取得子项个数 } @Override public Object getGroup(int groupPosition) { // 取得组对象 return this.groups[groupPosition]; } @Override public int getGroupCount() { // 取得组个数 return this.groups.length; } @Override public long getGroupId(int groupPosition) { // 取得组ID return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // 取得组显示组件 TextView textView = buildTextView(); // 建立组件 textView.setText(this.getGroup(groupPosition).toString()); // 设置文字 return textView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } |