android 二级列表ex,程序猿媛三:ExpandableListView二级菜单选择

二级菜单展开选择列表内容

声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。

您可以到博客的“友情链接”中,“程序猿媛(最新下载)*.*”下载最新版本,持续更新!当前版本,也可直接点击“当前1.2版本”下载。

本文介绍,利用ExpandableListView列表展示,并可选择各个列表项。

首先,看下实现效果:

f06f472bc25f3a388795c2b1121cd853.png2d1eefcaaa078d147abc474091b857a1.png  0cf7dc571f8c96531978e23a59570180.png

下面,介绍实现关键步骤,

代码里主要自定义了ExpListAdapter,继承自BaseExpandableListAdapter。里面会需要重写一些方法。需要重写的方法很多,其关键:

是构造方法中数据的创建;

组项在getGroupView中的更新;

二级列表在getChildView中的更新。

另外,可以关注的方法有:

点击组项,列表展开事件的处理;

以及,子列表项点击事件的设置。

下面,依次介绍:

在构造方法中,创建数据

因为只是思路的阐述,这里使用了固定数据做演示:

// 在array.xml中定义了子列表的数组

private int[] childResIds = new int[] {

R.array.array_explist_child_wei_name,

R.array.array_explist_child_shu_name,

R.array.array_explist_child_wu_name

};

// 存储组数据

private ArrayList list;

// 记录选择的子项

private HashMap> mSelectIds;

@SuppressLint("UseSparseArrays")

public ExpListAdapter() {

mSelectIds = new HashMap>();

list = new ArrayList();

String[] parent = getResources().getStringArray(R.array.array_explist_title_name);

getResources().getStringArray(R.array.array_explist_child_wei_name);

for(int i=0, size=parent.length; i

SelectChildData p = new SelectChildData();

String[] child = getResources().getStringArray(childResIds[i]);

ArrayList cl = new ArrayList();

for(int j=0, len=child.length; j

SelectChildData c = new SelectChildData();

c.id = j;

c.name = child[j];

cl.add(c);

}

p.id = i;

p.name = parent[i];

p.children = cl;

list.add(p);

mSelectIds.put(i, new HashSet());

}

}

如果需要是动态数据的话,在构造方法中,只进行成员变量的创建,不赋值。在需要的时候,通过方法调用进行动态添加即可,请根据实际使用情况扩展,不赘述!

组数据在getGroupView中的更新

其中,主要是布局的加载,和数据的设置,代码如下:

@Override

public View getGroupView(int groupPosition, boolean isExpanded,

View convertView, ViewGroup parent) {

// 加载组布局,获取内容

GroupViewHolder holder;

if(null == convertView) {

convertView = View.inflate(ExpListSelectActivity.this, R.layout.explist_group_item, null);

holder = new GroupViewHolder();

holder.mTitle = (TextView) convertView.findViewById(R.id.explist_group_title);

holder.mSelNum = (TextView) convertView.findViewById(R.id.explist_group_selected_num);

holder.mIndicator = (ImageView) convertView.findViewById(R.id.explist_group_indicator);

convertView.setTag(holder);

} else {

holder = (GroupViewHolder) convertView.getTag();

}

// 获取数据

SelectChildData data = (SelectChildData) getGroup(groupPosition);

// 标题设置

holder.mTitle.setText(data.name);

// 当前选择内容数量,和总数,显示如:(1/10)

ArrayListlist = data.children;

int cnt = 0, num = 0;

if(null != list && !list.isEmpty()) {

HashSet cids = mSelectIds.get(groupPosition);

for(SelectChildData d : list) {

if(cids.contains(d.id)) {

num ++;

}

}

cnt = list.size();

}

holder.mSelNum.setText(

String.format(getResources().getString(R.string.str_trans_receiver_num), num, cnt));

// 设置右侧显示图标

if(isExpanded) {

holder.mIndicator.setImageResource(R.drawable.icon_sub);

convertView.setSelected(true);

} else {

holder.mIndicator.setImageResource(R.drawable.icon_add);

convertView.setSelected(false);

}

return convertView;

}

二级列表在getChildView中的更新

同组数据类似,主要也是布局的加载,和数据的设置,限于版面,就不贴代码了,请需要的猿媛下载查看源码。

点击组项,列表展开事件的处理

在这里,我是在点击某项展开的时候,将展开的项进行了收缩,处理如下:

@Override

public void onGroupExpanded(int groupPosition) {

// mExpListView 是列表实例,通过判断它的状态,关闭已经展开的。

for(int i=0, cnt=getGroupCount(); i

if(groupPosition != i && mExpListView.isGroupExpanded(i)) {

mExpListView.collapseGroup(i);

}

}

super.onGroupExpanded(groupPosition);

}

子列表项点击事件的设置

代码中,定义了子列表项点击监听,在里面更新选择子项的内容记录。

// 定义监听事件,子列表项点击后,调用Adapter的方法进行更新

private OnChildClickListener mOnChildClickListener = new OnChildClickListener() {

@Override

public boolean onChildClick(ExpandableListView parent, View v,

int groupPosition, int childPosition, long id) {

mExpListAdapter.onChildClick(groupPosition, childPosition);

return true;

}

};

// Adapter中的子列表项点击处理方法

// 根据列表自身特性,通过从0开始的位置,作为key进行记录

public void onChildClick(int groupPosition, int childPosition) {

HashSet children = mSelectIds.get(groupPosition);

if(children.contains(childPosition)) {

children.remove(childPosition);

} else {

children.add(childPosition);

}

notifyDataSetChanged();

}

最后,可以在文初的截图中看到,点击“确定”按钮,通过Toast显示了选择的内容,获取内容的方法在ExpListAdapter中定义,主要是对记录的内容进行了拼接,如下:

public String getSelectInfo() {

StringBuilder s = new StringBuilder();

for(int i=0, size=mSelectIds.size(); i

HashSet children = mSelectIds.get(i);

// 记录不为空,则遍历列表去查找。

if(!children.isEmpty()) {

s.append(list.get(i).name);

s.append(": ");

ArrayList cl = list.get(i).children;

for(int j=0, len=cl.size(); j

if(children.contains(cl.get(j).id)) {

s.append(cl.get(j).name);

s.append(" ");

}

}

s.append("\n");

}

}

if(s.length() > 0) {

return s.toString();

} else {

return "No Selection";

}

}

Ok,基本点就这些了,应用安装后的源码获取,及获取后文件结构的情况,可以参考“程序猿媛”系列博文的第一篇:Android滑动翻页+区域点击事件

您可以到博客的“友情链接”中,“程序猿媛(最新下载)*.*”下载最新版本,持续更新!当前版本,也可直接点击“当前1.2版本”下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值