Android之ExpandableList擴展用法(基於BaseExpandableListAdapter)


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;
        }
    }
}

  上述代碼中,過向BaseExpandableListAdapter傳遞兩個動態數組groupList(表示目錄頭信息)和childList (表示子項信息)來構建目錄,一方面能夠實現動態的添加數據,另一方面簡化了實現,一舉兩得。另外,重寫的BaseExpandableListAdapter,如果應用在實際項目中,需要對getGroupView()和getChildView()方法進行構建緩存(和ListView構建一樣),以便優化性能和防止內存泄漏。需要的朋友可以自己構建。

 歡迎關注公眾號"Devin說",會不定期更新技術知識


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM