Android ExpandableList扩展用法
1.简介
基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两个数组,第一个是表示Group(目录头)信息的一维数组,第二个是表示Child(目录子项)的二维数组数组;第二种是构建两个类,一个是表示目录信息的GroupInfo类,另一个是表示子项信息的ChildInfo类,然后传入BaseExpandableListAdapter。通过对比发现,第一种方法由于数组是固定的,而实际项目中往往需要动态变化的目录和子项,因此用处不大,第二种方法文件太多,实现复杂。这里提供一种方法,传递两个个动态的二维数组来实现目录结构.
2.代码
- package com.devin;
 - import java.util.ArrayList;
 - import android.app.Activity;
 - import android.graphics.Color;
 - import android.graphics.drawable.ColorDrawable;
 - import android.os.Bundle;
 - import android.view.Gravity;
 - import android.view.View;
 - import android.view.View.OnClickListener;
 - import android.view.ViewGroup;
 - import android.widget.BaseExpandableListAdapter;
 - import android.widget.ExpandableListAdapter;
 - import android.widget.ExpandableListView;
 - import android.widget.ImageView;
 - import android.widget.LinearLayout;
 - import android.widget.TextView;
 - public class PadTestActivity extends Activity {
 - protected void onCreate(Bundle savedInstanceState) {
 - super.onCreate(savedInstanceState);
 - ArrayList<String> groupList = new ArrayList<String>();
 - for (int i = 0; i < 3; i++) {
 - groupList.add("title");
 - }
 - ArrayList<String> itemList1 = new ArrayList<String>();
 - itemList1.add("Item1");
 - itemList1.add("Item2");
 - ArrayList<String> itemList2 = new ArrayList<String>();
 - itemList2.add("Item1");
 - itemList2.add("Item21");
 - itemList2.add("Item3");
 - ArrayList<String> itemList3 = new ArrayList<String>();
 - itemList3.add("Item1");
 - itemList3.add("Item2");
 - itemList3.add("Item3");
 - itemList3.add("Item4");
 - ArrayList<ArrayList<String>> childList = new ArrayList<ArrayList<String>>();
 - childList.add(itemList1);
 - childList.add(itemList2);
 - childList.add(itemList3);
 - ExpandableListView list = new ExpandableListView(this);
 - ExpandableListAdapter mAdapter = new MyExpandableListAdapter(groupList, childList);
 - list.setAdapter(mAdapter);
 - list.setCacheColorHint(0x00000000);
 - list.setSelector(new ColorDrawable(Color.TRANSPARENT));
 - list.setGroupIndicator(null);
 - for (int i = 0; i < mAdapter.getGroupCount(); i++) {
 - list.expandGroup(i);
 - }
 - setContentView(list);
 - }
 - private class MyExpandableListAdapter extends BaseExpandableListAdapter {
 - private ArrayList<String> groupList;
 - private ArrayList<ArrayList<String>> childList;
 - MyExpandableListAdapter(ArrayList<String> groupList, ArrayList<ArrayList<String>> childList) {
 - this.groupList = groupList;
 - this.childList = childList;
 - }
 - public Object getChild(int groupPosition, int childPosition) {
 - return childList.get(groupPosition).get(childPosition);
 - }
 - private int selectedGroupPosition = -1;
 - private int selectedChildPosition = -1;
 - public void setSelectedPosition(int selectedGroupPosition, int selectedChildPosition) {
 - this.selectedGroupPosition = selectedGroupPosition;
 - this.selectedChildPosition = selectedChildPosition;
 - }
 - public long getChildId(int groupPosition, int childPosition) {
 - return childPosition;
 - }
 - public int getChildrenCount(int groupPosition) {
 - return childList.get(groupPosition).size();
 - }
 - public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
 - TextView textView = null;
 - if (convertView == null) {
 - textView = new TextView(PadTestActivity.this);
 - textView.setPadding(32, 10, 0, 10);
 - convertView = textView;
 - } else {
 - textView = (TextView) convertView;
 - }
 - textView.setText(getChild(groupPosition, childPosition).toString());
 - if (groupPosition == selectedGroupPosition) {
 - if (childPosition == selectedChildPosition) {
 - textView.setBackgroundColor(0xffb6ddee);
 - } else {
 - textView.setBackgroundColor(Color.TRANSPARENT);
 - }
 - }
 - textView.setOnClickListener(new OnClickListener() {
 - public void onClick(View v) {
 - setSelectedPosition(groupPosition, childPosition);
 - notifyDataSetChanged();
 - }
 - });
 - return textView;
 - }
 - public Object getGroup(int groupPosition) {
 - return groupList.get(groupPosition);
 - }
 - public int getGroupCount() {
 - return groupList.size();
 - }
 - public long getGroupId(int groupPosition) {
 - return groupPosition;
 - }
 - public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
 - LinearLayout cotain = new LinearLayout(PadTestActivity.this);
 - cotain.setPadding(0, 10, 0, 10);
 - cotain.setGravity(Gravity.CENTER_VERTICAL);
 - ImageView imgIndicator = new ImageView(PadTestActivity.this);
 - TextView textView = new TextView(PadTestActivity.this);
 - textView.setText(getGroup(groupPosition).toString());
 - textView.setPadding(5, 0, 0, 0);
 - if (isExpanded) {
 - imgIndicator.setBackgroundResource(R.drawable.macro_minus);
 - } else {
 - imgIndicator.setBackgroundResource(R.drawable.macro_plus);
 - }
 - cotain.addView(imgIndicator);
 - cotain.addView(textView);
 - return cotain;
 - }
 - public boolean hasStableIds() {
 - return true;
 - }
 - public boolean isChildSelectable(int groupPosition, int childPosition) {
 - return true;
 - }
 - }
 - }
 
3.
上述代码中,过向BaseExpandableListAdapter传递两个动态数组groupList(表示目录头信息)和childList (表示子项信息)来构建目录,一方面能够实现动态的添加数据,另一方面简化了实现,一举两得。另外,重写的BaseExpandableListAdapter,如果应用在实际项目中,需要对getGroupView()和getChildView()方法进行构建缓存(和ListView构建一样),以便优化性能和防止内存泄漏。需要的朋友可以自己构建.
                    
                
                
            
        
浙公网安备 33010602011771号