A022-列表容器之ExpandableListView

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 {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值