先看效果图:
要实现这个效果,activity必须实现ExpandableListActivity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
mContactListView = getExpandableListView();
mContactListView.setBackgroundResource(R.drawable.default_bg);
registerForContextMenu(mContactListView);
mContactDataBase = ((ContactApplication) getApplication())
.getmContactDataBase();
getExpandableListView().setCacheColorHint(0);// 拖动时避免出现黑色
getExpandableListView().setDivider(null);// 去掉每项下面的黑线(分割线)
// 自定义下拉图标
getExpandableListView().setGroupIndicator(
getResources().getDrawable(R.drawable.expander_ic_folder));
setAdatperForExpandableListView();
}
/**
* 设置ExpandableListView的adapter
*/
private void setAdatperForExpandableListView() {
Cursor groupCursor = mContactDataBase.getAllGroups(); //这个是从数据库里查询出所有的组
Util.d(TAG, "groupCursor=" + groupCursor);
// curosr的生命周期将和activity有关
startManagingCursor(groupCursor);
// set my adapter
ContactTreeAdapter contactTreeAdapter = new ContactTreeAdapter(
groupCursor, this, true, mContactDataBase);
setListAdapter(contactTreeAdapter);
}
主要实现ContactTreeAdapter这个adapter
public class ContactTreeAdapter extends CursorTreeAdapter {
/** log tag. */
private static final String TAG = "ContactTreeAdapter";
/** context */
public Context mContext = null;
private Cursor mCursor = null;
private ContactDataBase mContactDataBase;
// contact表字段索引
private static final int INDEX_NAME = 1;
private static final int INDEX_PHONENUMBER = 2;
// group表字段索引
private static final int INDEX_GROUPNAME = 1;
public ContactTreeAdapter(Cursor cursor, Context context,
boolean autoRequery, ContactDataBase contactDataBase) {
super(cursor, context, autoRequery);
mContext = context;
this.mContactDataBase = contactDataBase;
// TODO Auto-generated constructor stub
}
@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
// TODO Auto-generated method stub
String groupName = groupCursor.getString(INDEX_GROUPNAME);// 得到当前的组名
Cursor childCursor = mContactDataBase.getContactsByGroupName(groupName);
return childCursor;
}
@Override
protected View newGroupView(Context context, Cursor cursor,
boolean isExpanded, ViewGroup parent) {
// TODO Auto-generated method stub
Util.d(TAG, "newGroupView");
LayoutInflater inflate = LayoutInflater.from(mContext);
View view = inflate.inflate(R.layout.grouplayout, null);
bindGroupView(view, context, cursor, isExpanded);
return view;
}
@Override
protected void bindGroupView(View view, Context context, Cursor cursor,
boolean isExpanded) {
// TODO Auto-generated method stub
Util.d(TAG, "bindGroupView");
TextView groupName = (TextView) view.findViewById(R.id.groupName);
String group = cursor.getString(INDEX_GROUPNAME);
groupName.setText(group);
TextView groupCount = (TextView) view.findViewById(R.id.groupCount);
int count = mContactDataBase.getCountContactByGroupName(group);
Util.d(TAG, "count=" + count + "group=" + group);
groupCount.setText("[" + count + "]");
}
@Override
protected View newChildView(Context context, Cursor cursor,
boolean isLastChild, ViewGroup parent) {
// TODO Auto-generated method stub
Util.d(TAG, "newChildView");
LayoutInflater inflate = LayoutInflater.from(mContext);
View view = inflate.inflate(R.layout.childlayout, null);
bindChildView(view, context, cursor, isLastChild);
return view;
}
@Override
protected void bindChildView(View view, Context context, Cursor cursor,
boolean isLastChild) {
// TODO Auto-generated method stub
Util.d(TAG, "bindChildView cursor.getString(INDEX_PHONENUMBER)="
+ cursor.getString(INDEX_PHONENUMBER));
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(cursor.getString(INDEX_NAME));
TextView description = (TextView) view.findViewById(R.id.description);
description.setTextKeepState(cursor.getString(INDEX_PHONENUMBER));
}
}
因为这个adapter的函数命名就可以看出是干什么的就不一一解释了
原文:http://blog.csdn.net/baidu_nod/article/details/38182539