[Android]BaseExpandableListAdapter实现可折叠列表
使用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同学约翰·史密斯,收集李四)