ExpandableListActivity 可扩展列表Activity
ExpandableListView
例子1 知识点: 1. 层级关系 2. 点击item 3. 上下文菜单
public class MainActivity extends ExpandableListActivity {
private static final String NAME = "NAME";
private static final String IS_EVEN = "IS_EVEN";
private ExpandableListAdapter mAddapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
for (int i = 0; i < 20; i++) {
Map<String, String> curGroupMap = new HashMap<>();
groupData.add(curGroupMap);
curGroupMap.put(NAME, "Group " + i);
curGroupMap.put(IS_EVEN, (i % 2 == 0) ? "This group is even" : "This group is odd");
List<Map<String, String>> children = new ArrayList<>();
for (int j = 0; j < 15; j++) {
Map<String, String> curChildMap = new HashMap<>();
children.add(curChildMap);
curChildMap.put(NAME, i + "|Child " + j);
curChildMap.put(IS_EVEN, (j % 2 == 0) ? "This child is even" : "This child is odd");
}
childData.add(children);
}
mAddapter = new SimpleExpandableListAdapter(
this,
groupData,
android.R.layout.simple_expandable_list_item_2,
new String[]{NAME, IS_EVEN},
new int[]{
android.R.id.text1, android.R.id.text2
},
childData,
android.R.layout.simple_expandable_list_item_2,
new String[]{NAME, IS_EVEN},
new int[]{
android.R.id.text1, android.R.id.text2
}
);
setListAdapter(mAddapter);
registerForContextMenu(getExpandableListView());
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Sample menu");
ExpandableListView.ExpandableListContextMenuInfo info =
(ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
int group = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int child = ExpandableListView.getPackedPositionChild(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
} else {
}
menu.add(0, 0, 0, "" + type + ", g=" + group + ", c=" + child);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
ExpandableListView.ExpandableListContextMenuInfo info =
(ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
StringBuilder sb = new StringBuilder();
if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
sb.append("child => group=" + groupPos + ", child=" + childPos);
} else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
sb.append("group => group=" + groupPos);
} else {
sb.append("unknown " + type);
}
Toast.makeText(this, sb.toString(), Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
}
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(this, "child => group=" + groupPosition + ", child=" + childPosition, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, TestActivity.class);
this.startActivity(intent);
return super.onChildClick(parent, v, groupPosition, childPosition, id);
}
}
例子2 知识点: 1. BaseExpandableListAdapter 2. 修改ExpandableListView的箭头图标 3. <selector>应该放入drawable而不是layout 4. checkbox 系统星图标:@android:drawable/btn_star 5. style的使用
// TestActivity.java
public class TestActivity extends ExpandableListActivity {
TestExpandableListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new TestExpandableListAdapter(this);
setListAdapter(mAdapter);
getExpandableListView().setGroupIndicator(this.getResources().getDrawable(R.drawable.expandablelistviewselector));
}
}
// TestExpandableListAdapter.java
public class TestExpandableListAdapter extends BaseExpandableListAdapter {
private static final int GROUP_NUMBER = 10;
private Context mContext;
private LayoutInflater mInflater = null;
public TestExpandableListAdapter(Context context) {
mContext = context;
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getGroupCount() {
return GROUP_NUMBER;
}
@Override
public int getChildrenCount(int groupPosition) {
return groupPosition + 1;
}
@Override
public Object getGroup(int groupPosition) {
return "group " + groupPosition;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return "child " + groupPosition + "-" + childPosition;
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return groupPosition * GROUP_NUMBER + childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
private TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, (int) (45 * mContext.getResources().getDisplayMetrics().density));
TextView textView = new TextView(mContext);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding((int) (35 * mContext.getResources().getDisplayMetrics().density), 0, 0, 0);
return textView;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View view = mInflater.inflate(R.layout.history_row, null, false);
TextView titleView = (TextView) view.findViewById(R.id.HistoryRow_Title);
titleView.setText(getChild(groupPosition, childPosition).toString());
return view;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
# drawable/expandablelistviewselector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_expanded="true" android:drawable="@drawable/ic_btn_find_next" />
<item android:drawable="@drawable/ic_btn_find_prev" />
</selector>
# layout/histroy_row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants"
android:paddingBottom="5dip"
android:paddingLeft="25dip"
android:paddingTop="5dip" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:id="@+id/HistoryRow.Thumbnail"
android:layout_gravity="center"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:padding="2dip"
android:background="@drawable/fav_icn_background"></ImageView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/HistoryRow.Thumbnail"
android:layout_toLeftOf="@+id/HistoryRow.BookmarkStar"
android:orientation="vertical" android:layout_gravity="center_vertical">
<TextView android:layout_gravity="center_vertical"
android:ellipsize="end"
android:singleLine="true"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:id="@+id/HistoryRow.Title" android:text="@+id/HistoryRow.Title"
style="@style/History.Title" />
<TextView android:layout_height="wrap_content" android:id="@+id/HistoryRow.Url"
android:ellipsize="end"
android:singleLine="true"
android:text="@+id/HistoryRow.Url" android:layout_width="fill_parent"
style="@style/History.Url" />
</LinearLayout>
<CheckBox
android:id="@+id/HistoryRow.BookmarkStar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_alignParentRight="true"
android:button="@android:drawable/btn_star" />
</RelativeLayout>
# values/styles.xml
<style name="History">
</style>
<style name="History.Title">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@android:color/white</item>
</style>
<style name="History.Url">
<item name="android:textSize">12sp</item>
<item name="android:textColor">#888888</item>
</style>