使用BaseExpandableListAdapter 以實作的可折疊的所謂清單,例如QQ朋友們在分組功能。
基于BaseExpandableListAdapter擴大ExpandableList說明,今天,有兩個主要的網上流行:第一種方法是BaseExpandableListAdapter傳入兩個數組,第一個是表示Group(檔案夾頭)資訊的一維數組,第二個是表示Child(檔案夾子項)的二維數組數組;另外一種是建構兩個類,一個是表示檔案夾資訊的GroupInfo類。還有一個是表示子項資訊的ChildInfo類,然後傳入BaseExpandableListAdapter。通過對照發現,第一種方法因為數組是固定的。而實際項目中往往須要動态變化的檔案夾和子項。是以用處不大。另外一種方法檔案太多,實作複雜。這裡提供一種方法,傳遞兩個個動态的二維數組來實作檔案夾結構。
package com.example.test;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
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;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Group資料
ArrayList<String> groupList = new ArrayList<String>();
groupList.add("我的好友");
groupList.add("我的親人");
groupList.add("我的同學");
//Child資料
ArrayList<String> itemList1 = new ArrayList<String>();
itemList1.add("小米");
itemList1.add("小李");
ArrayList<String> itemList2 = new ArrayList<String>();
itemList2.add("小麗");
itemList2.add("小小");
itemList2.add("小可");
ArrayList<String> itemList3 = new ArrayList<String>();
itemList3.add("小南");
itemList3.add("小飛");
itemList3.add("小丁");
itemList3.add("小美");
ArrayList<ArrayList<String>> childList = new ArrayList<ArrayList<String>>();
childList.add(itemList1);
childList.add(itemList2);
childList.add(itemList3);
//可折疊List
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);
}
//Adapter
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(MainActivity.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(MainActivity.this);
cotain.setPadding(0, 10, 0, 10);
cotain.setGravity(Gravity.CENTER_VERTICAL);
ImageView imgIndicator = new ImageView(MainActivity.this);
TextView textView = new TextView(MainActivity.this);
textView.setText(getGroup(groupPosition).toString());
textView.setPadding(5, 0, 0, 0);
if (isExpanded) {
imgIndicator.setBackgroundResource(R.drawable.bg_arrow_up);
} else {
imgIndicator.setBackgroundResource(R.drawable.bg_arrow_down);
}
cotain.addView(imgIndicator);
cotain.addView(textView);
return cotain;
}
public boolean hasStableIds() {
return true;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
groupList 用于組名(類似QQ好友、同學、朋友),
childList 每個元素是一組子資料的(類似QQ同學約翰·史密斯,收集李四)