android:background=“@drawable/ic_leftnav_10” />
<TextView
android:id=“@+id/tv_group_text”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_centerVertical=“true”
android:layout_marginLeft=“59dp”
android:text=“时局”
android:textColor=“#333333”
android:textSize=“16sp” />
<View 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】
android:id=“@+id/item_group_devider”
android:layout_width=“match_parent”
android:layout_height=“0.5dp”
android:layout_alignLeft=“@+id/tv_group_text”
android:layout_alignParentBottom=“true”
android:background=“@color/listview_divider”
android:layout_marginRight=“10dp”
android:visibility=“visible”/>
<ImageView
android:id=“@+id/iv_expand”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_alignParentRight=“true”
android:layout_centerVertical=“true”
android:layout_marginRight=“25dp”
android:clickable=“true”
android:padding=“5dp”
android:src=“@drawable/ic_leftnav_down” />
layout/layout_expand_item.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“40dp”
android:background=“@drawable/slidingmenu_item_selector”
android:minHeight=“?android:attr/listPreferredItemHeight” >
<TextView
android:id=“@+id/tv_item_text”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_centerVertical=“true”
android:layout_marginLeft=“75dp”
android:text=“时局”
android:textColor=“@drawable/slidingmenu_item_text_selector”
android:textSize=“15sp”
android:clickable=“true”
/>
<View
android:id=“@+id/item_devider”
android:layout_width=“match_parent”
android:layout_height=“0.5dp”
android:layout_alignParentBottom=“true”
android:layout_marginLeft=“59dp”
android:layout_marginRight=“10dp”
android:background=“@color/listview_divider”
android:visibility=“visible” />
自定义Adapter
- 继承BaseExpandableListAdapter并实现以下方法
- getGroupCount(获取组项的个数)
- getChildrenCount(获取子项个数)
- getGroup(获取组对象)
- getChild(获取子对象)
- getGroupId(获取组项id)
- getChildId(获取子项id)
- hasStableIds(组和子元素是否持有稳定的ID)
- getGroupView(获取显示指定组的视图对象)
- getChildView(获取显示指定项的视图对象)
- isChildSelectable(子项是否可选中)
- 传入组项列表(如:List<GroupItem>
)
- 传入子项列表(如:List<List<Category>>
)
适配器代码:
com.devilwwj.androiddevelopcourse.adapters.ExpandableListViewAdapter
package com.devilwwj.androiddevelopcourse.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.devilwwj.androiddevelopcourse.R;
import com.devilwwj.androiddevelopcourse.domain.Category;
import com.devilwwj.androiddevelopcourse.domain.GroupItem;
import java.util.HashMap;
import java.util.List;
/**
- 自定义可展开列表的适配器
*/
public class ExpandableListViewAdapter extends BaseExpandableListAdapter {
private Context mContext;// 上下文
private ExpandableListView expandableListView; // 可展开列表对象
private List groupList; // 组列表
private List<List> childList; // 子项列表
private LayoutInflater inflater;
// 自定义接口回调监听器
private OnGroupExpandListener OnGroupExpandListener;
private OnGroupClickListener onGroupClickListener;
private OnChildItemClickListener onChildClickListener;
private HashMap<Integer, Boolean> maps = new HashMap<Integer, Boolean>();
private boolean expandStateAtPosition = false;
public OnGroupClickListener getOnGroupClickListener() {
return onGroupClickListener;
}
public void setOnGroupClickListener(
OnGroupClickListener onGroupClickListener) {
this.onGroupClickListener = onGroupClickListener;
}
public OnGroupExpandListener getOnGroupExpandListener() {
return OnGroupExpandListener;
}
public void setOnGroupExpandListener(
OnGroupExpandListener onGroupExpandListener) {
OnGroupExpandListener = onGroupExpandListener;
}
public OnChildItemClickListener getOnChildClickListener() {
return onChildClickListener;
}
public void setOnChildClickListener(
OnChildItemClickListener onChildClickListener) {
this.onChildClickListener = onChildClickListener;
}
private int mExpandedGroupPosition;
public int getExpandedGroupPosition() {
return mExpandedGroupPosition;
}
public void setExpandedGroupPosition(int mExpandedGroupPosition) {
this.mExpandedGroupPosition = mExpandedGroupPosition;
}
public ExpandableListViewAdapter(Context context,
ExpandableListView expandableListView, List groupList,
List<List> childList) {
super();
this.mContext = context;
this.expandableListView = expandableListView;
this.groupList = groupList;
this.childList = childList;
inflater = LayoutInflater.from(context);
// 初始化列表展开状态
for (int i = 0; i < groupList.size(); i++) {
maps.put(i, false);
}
}
private int mGroupPosition = 0;
private int mChildPosition = 0;
/**
-
设置子项被选中方法
-
@param groupPosition
-
@param childPosition
*/
public void setItemChecked(int groupPosition, int childPosition) {
if (expandableListView == null) {
return;
}
this.mGroupPosition = groupPosition;
this.mChildPosition = childPosition;
int numberOfGroupThatIsOpened = 0;
for (int i = 0; i < groupPosition; i++) {
if (expandableListView.isGroupExpanded(i)) {
numberOfGroupThatIsOpened += this.getChildrenCount(i);
}
}
int position = numberOfGroupThatIsOpened + groupPosition
- childPosition + 1;
if (!expandableListView.isItemChecked(position)) {
expandableListView.setItemChecked(position, true);
}
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return childList.get(groupPosition).size();
}
/*
-
获得组项 (non-Javadoc)
-
@see android.widget.ExpandableListAdapter#getGroup(int)
*/
@Override
public GroupItem getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public Category getChild(int groupPosition, int childPosition) {
return childList.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
final GroupViewHolder groupViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.layout_expand_group, parent,
false);
groupViewHolder = new GroupViewHolder(convertView);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
GroupItem groupItem = groupList.get(groupPosition);
groupViewHolder.itemGroupIcon.setBackgroundResource(groupItem
.getDrawableId());
groupViewHolder.itemGroupText.setText(groupItem.getText());
// 如果该组没有子项,则不显示箭头
if (childList.get(groupPosition).size() == 0) {
groupViewHolder.itemArrow.setVisibility(View.GONE);
groupViewHolder.itemGroupLayout
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onGroupClickListener.onGroupClick(groupPosition);
}
});
} else {
groupViewHolder.itemArrow.setVisibility(View.VISIBLE);
groupViewHolder.itemGroupLayout
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
OnGroupExpandListener.onGroupExpand(groupPosition);
}
});
}
groupViewHolder.itemGroupText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onGroupClickListener.onGroupClick(groupPosition);
}
});
groupViewHolder.itemArrow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
OnGroupExpandListener.onGroupExpand(groupPosition);
}
});
// 判断isExpanded就可以控制按下还是关闭,同时更换图片,这里使用属性动画来控制旋转
if (isExpanded) {
groupViewHolder.itemArrow
.setImageResource(R.drawable.ic_leftnav_up);
// 没有孩子项就不隐藏分割线
if (childList.get(groupPosition).size() > 0) {
groupViewHolder.itemDivider.setVisibility(View.INVISIBLE);
} else {
groupViewHolder.itemDivider.setVisibility(View.VISIBLE);
}
} else {
groupViewHolder.itemArrow
.setImageResource(R.drawable.ic_leftnav_down);
groupViewHolder.itemDivider.setVisibility(View.VISIBLE);
}
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final ChildViewHolder childViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.layout_expand_item,
parent, false);
childViewHolder = new ChildViewHolder(convertView);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
String content = childList.get(groupPosition).get(childPosition)
.getTitle();
// 设置内容
childViewHolder.itemChildText.setText(content);
// 设置文本点击事件
childViewHolder.itemChildText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onChildClickListener.onChildItemClick(groupPosition,
childPosition);
}
});
if (childPosition == childList.get(groupPosition).size() - 1) {
childViewHolder.itemDivider.setVisibility(View.VISIBLE);
} else {
childViewHolder.itemDivider.setVisibility(View.GONE);
}
// 设置子项被选中的状态
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// 设置孩子项可选中
return true;
}
private static class GroupViewHolder {
RelativeLayout itemGroupLayout;
ImageView itemGroupIcon;
TextView itemGroupText;
ImageView itemArrow;
View itemDivider;
public GroupViewHolder(View convertView) {
itemGroupLayout = (RelativeLayout) convertView
.findViewById(R.id.group_layout);
itemGroupIcon = (ImageView) convertView
.findViewById(R.id.iv_group_icon);
itemGroupText = (TextView) convertView
.findViewById(R.id.tv_group_text);
itemArrow = (ImageView) convertView.findViewById(R.id.iv_expand);
itemDivider = (View) convertView
.findViewById(R.id.item_group_devider);
}
}
private static class ChildViewHolder {
TextView itemChildText;
View itemDivider;
public ChildViewHolder(View convertView) {
itemChildText = (TextView) convertView
.findViewById(R.id.tv_item_text);
itemDivider = (View) convertView.findViewById(R.id.item_devider);
}
}
public interface OnGroupExpandListener {
void onGroupExpand(int position);
}
public interface OnGroupClickListener {