一、ExpandableListView初识
之前对于ExpandableListView的理解并不是很了解,由于最近的项目需要用到才开始认真的去查看下相关的知识,其实 ExpandableListView类似于listview,它同样也有自己的布局适配器,也同样有getView和getConunt方法,可以这么理解,ExpandableListView两个listview的结合,嵌套而已
二、ExpandableListView的初步使用
ExpandableListView有一级适配器和二级适配器,我们来看看一级适配器的代码:
public class ParentAdapter extends BaseExpandableListAdapter{
private Realm realm;
private Context mContext;
private List parents;
private List childAdapterLists;
public ParentAdapter(Context mContext, List parents, Realm realm, List childAdapterLists) {
this.mContext = mContext;
this.parents = parents;
this.realm = realm;
this.childAdapterLists = childAdapterLists;
}
public void setData(List parents, List childAdapterLists) {
this.parents = parents;
this.childAdapterLists = childAdapterLists;
notifyDataSetChanged();
}
public List getData(){
return parents;
}
public List getAdapterList(){
return childAdapterLists;
}
@Override
public int getGroupCount() {
return parents != null ? parents.size() : 0;
}
@Override
public int getChildrenCount(int groupPosition) {
return parents.get(groupPosition).getChilds() != null ? parents
.get(groupPosition).getChilds().size() : 0;
}
@Override
public ParentEntity getGroup(int groupPosition) {
return parents.get(groupPosition);
}
@Override
public ChildEntity getChild(int groupPosition, int childPosition) {
return parents.get(groupPosition).getChilds().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 true;
}
/**
* 根布局
* @param groupPosition
* @param isExpanded
* @param convertView
* @param parent
* @return
*/
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.parent_group_item, null);
holder = new GroupHolder(convertView);
convertView.setTag(holder);
} else {
holder = (GroupHolder) convertView.getTag();
}
if(!isExpanded){
holder.parentGroup_iv.setBackgroundResource(R.mipmap.img_fangda);
}else{
holder.parentGroup_iv.setBackgroundResource(R.mipmap.img_suoxiao);
}
holder.update(parents.get(groupPosition),groupPosition);
return convertView;
}
/**
* 子列表的布局
* @param groupPosition
* @param childPosition
* @param isLastChild
* @param convertView
* @param parent
* @return
*/
@Override
public View getChildView(final int groupPosition, final int childPosition, final boolean isLastChild, View convertView, ViewGroup parent) {
final ExpandableListView eListView = getExpandableListView();
final ArrayList childs = new ArrayList();
final ChildEntity child = getChild(groupPosition, childPosition);
childs.add(child);
final ChildAdapter childAdapter = new ChildAdapter(this.mContext,
childs);
childAdapterLists.get(groupPosition).getChildAdapterEntitys().get(childPosition).setChildAdapter(childAdapter);
//存储每一个adapter用来刷新
eListView.setAdapter(childAdapter);
eListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPos, long id) {
}
});
/**
* 设置子列表的条目点击事件
* 点击子列表时,调用回调接口
*/
eListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupIdex, int childIdex, long id) {
}
});
childAdapterLists.get(groupPosition).getChildAdapterEntitys().get(childPosition).seteListView(eListView);
return eListView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
/**
* getchildview中动态创建子ExpandableListView
* @return
*/
public ExpandableListView getExpandableListView() {
final CustomExpandableListView mExpandableListView = new CustomExpandableListView(mContext);
mExpandableListView.setPadding(20,0,0,0);
mExpandableListView.setGroupIndicator(null);// 取消展开折叠的指示图标
return mExpandableListView;
}
/**
* 根布局的viewholder
*/
class GroupHolder {
private TextView parentGroupTV;
private ImageView parentGroup_iv;
private ImageView iv_parent_run;
public GroupHolder(View v) {
parentGroupTV = (TextView)v.findViewById(R.id.parentGroupTV);
parentGroup_iv = (ImageView)v.findViewById(R.id.parentGroup_iv);
iv_parent_run = (ImageView)v.findViewById(R.id.iv_parent_run);
}
public void update(ParentEntity model, int groupPosition) {
parentGroupTV.setText(model.getGroupName());
parentGroupTV.setTextColor(Color.parseColor("#6F6F6F"));
if (null != model.getChilds() && model.getChilds().size()>0){
if (model.getChilds().get(0).getChildTaskBean().get(0).isParentRun()){
iv_parent_run.setVisibility(View.VISIBLE);
}else{
iv_parent_run.setVisibility(View.INVISIBLE);
}
}else{
RealmResults where = realm.where(ParentEntity.class).findAll();
for (ParentEntity parentEntity:where) {
if (model.getGroupName().equals(parentEntity.getGroupName())){
if (parentEntity.getChilds().get(0).getChildTaskBean().get(0).isParentRun()){
iv_parent_run.setVisibility(View.VISIBLE);
}else{
iv_parent_run.setVisibility(View.INVISIBLE);
}
break;
}
}
}
}
}
核心代码在于getGroupView和getChildView,三级列表的话在getchildVie中在取创建新的ExpandableListView,然后给当前这个二级条目的ExpandableListView设置他的adpter,这样childadapter的使用就在这里了,我们看下面的核心代码:
/**
* 第二层布局
* @param groupPosition
* @param isExpanded
* @param convertView
* @param parent
* @return
*/
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.child_group_item, null);
holder = new GroupHolder(convertView);
convertView.setTag(holder);
} else {
holder = (GroupHolder) convertView.getTag();
}
if(!isExpanded){
holder.childGroup_iv.setBackgroundResource(R.mipmap.img_fangda);
}else{
holder.childGroup_iv.setBackgroundResource(R.mipmap.img_suoxiao);
}
holder.update(mChilds.get(groupPosition));
return convertView;
}
/**
* 第三层布局
* @param groupPosition
* @param childPosition
* @param isLastChild
* @param convertView
* @param parent
* @return
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildHolder holder = null;
if (convertView == null) {
convertView =LayoutInflater.from(mContext).inflate(R.layout.child_child_item, null);
holder = new ChildHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ChildHolder) convertView.getTag();
}
TaskBean taskBean = mChilds.get(groupPosition).getChildTaskBean().get(childPosition);
holder.update(taskBean);
return convertView;
}
在三级列表的实现过程中,项目的需求是要求点击条目后,将当前条目的颜色改变,当时思考这个问题后,考虑定义一个专门用来存放adpter三级集合,分别对应数据集合的每一条数据,这样一来当我们想要刷新某一个条目的时候,我们通过记录当前点击的条目的position,(一级,二级,三级的position)adpter集合找出点击的适配器后,改变对象的颜色,然后调用刷新,还要将上一个点击的颜色修改回来,这里同样也要记录上一个点击的条目,也是调用adpter刷新;还有一个重点就是ExpandableListView调用setOnGroupClickListener的时候,方法会有一个返回boolean值,如果返回true,那么条目将不可展开,这个我们要是想动态的不想展开,可以自己在代码中动态输入后改变;