ExpandableListView

本文介绍了一个使用 Android 中 ExpandableListView 的示例应用。该应用展示了如何创建分组和子项数据,并通过自定义适配器将这些数据展示给用户。此外,还实现了点击分组和子项时的回调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.foxconn;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.SimpleExpandableListAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableListViewDemo extends Activity {
private ExpandableListView exlv;
private List<Map<String, Contact>> groups;
private List<Map<String, List<Contact>>> childs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expandablelistview);
exlv = (ExpandableListView) findViewById(R.id.exlv_list);
groups = new ArrayList<Map<String, Contact>>();
childs = new ArrayList<Map<String,List<Contact>>>();
initGroupsData();

for(int i = 0; i < groups.size();i++){
initChildsData();
}


ContactJoinAdapter mAdapter = new ContactJoinAdapter(this,groups,childs);
exlv.setAdapter(mAdapter);
exlv.setClickable(true);

exlv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
// Looper.prepare();
Toast.makeText(ExpandableListViewDemo.this, groups.get(groupPosition).get("group").getName(), Toast.LENGTH_SHORT).show();
// Looper.loop();
System.out.println("==>"+groupPosition);
return false;
}
});

exlv.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
Toast.makeText(ExpandableListViewDemo.this, childs.get(groupPosition).get("child").get(childPosition).getName(), Toast.LENGTH_SHORT).show();
System.out.println("-->"+groupPosition+"-"+childPosition);

return false;
}
});


}

private void initChildsData() {

Map<String, List<Contact>> m1 = new HashMap<String, List<Contact>>();
List<Contact> list1 = new ArrayList<ExpandableListViewDemo.Contact>();
Contact c1 = new Contact("李1", R.drawable.e);
Contact c2 = new Contact("炸彈2", R.drawable.f);
Contact c3 = new Contact("的成3", R.drawable.g);
list1.add(c1);
list1.add(c2);
list1.add(c3);
m1.put("child", list1);
childs.add(m1);


}

private void initGroupsData() {

Contact c1 = new Contact("李", R.drawable.a);
Contact c2 = new Contact("炸彈", R.drawable.b);
Contact c3 = new Contact("的成", R.drawable.c);
Map<String, Contact> m1 = new HashMap<String, Contact>();
Map<String, Contact> m2 = new HashMap<String, Contact>();
Map<String, Contact> m3 = new HashMap<String, Contact>();

m1.put("group", c1);
m2.put("group", c2);
m3.put("group", c3);

groups.add(m1);
groups.add(m2);
groups.add(m3);

}

public class ContactJoinAdapter extends BaseExpandableListAdapter{
private Context context;
private List<Map<String, Contact>> mgroups;
private List<Map<String, List<Contact>>> mchilds;
private ChildView cv;
private GroupView gv;
private LayoutInflater inflater;

public class GroupView{
public ImageView gphoto;
public TextView gname;
public TextView gcount;
}

public class ChildView{
public ImageView cphoto;
public TextView cname;
public ImageButton check;
public ImageButton uncheck;

}

public ContactJoinAdapter(Context c,List<Map<String, Contact>> groups,List<Map<String, List<Contact>>> childs) {
inflater = LayoutInflater.from(c);
cv = new ChildView();
gv = new GroupView();
this.mgroups = groups;
this.mchilds = childs;
this.context = c;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
return mchilds.get(groupPosition).get("child").get(childPosition);
}

@Override
public long getChildId(int groupPosition, int childPosition) {

return childPosition;
}

@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {

View cview = inflater.inflate(R.layout.exchild, null);
cv.cphoto = (ImageView) cview.findViewById(R.id.im_cphoto);
cv.cname = (TextView) cview.findViewById(R.id.tv_cname);
cv.check = (ImageButton) cview.findViewById(R.id.ibtn_check);
cv.uncheck = (ImageButton) cview.findViewById(R.id.ibtn_uncheck);

cv.cphoto.setImageResource(mchilds.get(groupPosition).get("child").get(childPosition).getPhotoId());
cv.cname.setText(childs.get(groupPosition).get("child").get(childPosition).getName());


cv.check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cv.check.setVisibility(View.GONE);
cv.uncheck.setVisibility(View.VISIBLE);
}
});

cv.uncheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cv.uncheck.setVisibility(View.GONE);
cv.check.setVisibility(View.VISIBLE);
}
});



return cview;
}

@Override
public int getChildrenCount(int groupPosition) {
return mchilds.get(groupPosition).get("child").size();
}

@Override
public Object getGroup(int groupPosition) {
return mgroups.get(groupPosition).get("group");
}

@Override
public int getGroupCount() {
return mgroups.size();
}

@Override
public long getGroupId(int groupPosition) {

return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {

View view = inflater.inflate(R.layout.exgroup, null);
gv.gphoto = (ImageView) view.findViewById(R.id.im_gphoto);
gv.gname = (TextView) view.findViewById(R.id.tv_gname);
gv.gcount = (TextView) view.findViewById(R.id.tv_childcount);

gv.gphoto.setImageResource(mgroups.get(groupPosition).get("group").getPhotoId());
gv.gname.setText(mgroups.get(groupPosition).get("group").getName());
gv.gcount.setText("3");
//super.onCreate(savedInstanceState);
return view;
}

@Override
public boolean hasStableIds() {
return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {

return false;
}

}

public class Contact{
private String name;
private int photoId;
public Contact(String n,int i) {
this.name = n;
this.photoId = i;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPhotoId() {
return photoId;
}
public void setPhotoId(int photoId) {
this.photoId = photoId;
}



}

// @Override
// public boolean onChildClick(ExpandableListView parent, View v,
// int groupPosition, int childPosition, long id) {
// Toast.makeText(this, childs.get(groupPosition).get("child").get(childPosition).getName(), Toast.LENGTH_SHORT).show();
// return true;
// }


}


expandablelistview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ExpandableListView
android:id="@+id/exlv_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
/>
<TextView
android:id="@+id/join_empty"
android:text="No Data"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
/>
</RelativeLayout>


exgroup.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/im_gphoto"
android:layout_width="50dip"
android:layout_height="50dip"
android:src="@drawable/a"
android:layout_marginLeft="33dip"
/>
<TextView
android:id="@+id/tv_gname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/im_photo"
android:layout_centerHorizontal="true"
/>
<TextView
android:id="@+id/tv_childcount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/tv_name"
android:layout_marginLeft="12dip"
android:layout_alignParentRight="true"
android:textColor="@android:color/darker_gray"
/>
</RelativeLayout>


exchild.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/im_cphoto"
android:layout_width="50dip"
android:layout_height="50dip"
android:src="@drawable/c"
android:layout_marginLeft="50dip"
/>
<TextView
android:id="@+id/tv_cname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/im_photo"
android:layout_marginLeft="8dip"
android:layout_centerHorizontal="true"
/>
<ImageButton
android:id="@+id/ibtn_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/tv_name"
android:visibility="gone"
android:src="@drawable/check"
android:layout_marginRight="12dip"
android:layout_alignParentRight="true"
/>
<ImageButton
android:id="@+id/ibtn_uncheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/tv_name"
android:layout_marginRight="12dip"
android:src="@drawable/uncheck"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
基于STM32的循迹避障小车资料源码(高分项目),个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(
内容概要:本文详细介绍了SSM框架(Spring、SpringMVC、MyBatis)的相关知识,涵盖Maven项目管理工具、前端开发技术、HTTP协议及Tomcat服务器等内容。文章首先讲解了SSM框架的组成,包括Spring的IOC、DI、AOP等功能,SpringMVC的请求处理流程以及MyBatis的数据操作。接着介绍了Maven作为项目管理工具的作用,如依赖管理和项目构建,并详细描述了Maven的配置文件pom.xml的使用方法。此外,还探讨了HTTP协议的特点、请求响应格式,以及Web服务器Tomcat的基本概念和工作原理。最后,文章对前端开发技术进行了概述,包括HTML、CSS、JavaScript等基础知识,并简要介绍了Ajax技术。 适合人群:具备一定编程基础,特别是Java开发经验的研发人员,尤其是那些正在学习或使用SSM框架进行Web开发的工程师。 使用场景及目标:①理解SSM框架的工作原理及其各组成部分的功能;②掌握Maven的使用,包括项目创建、依赖管理、生命周期等;③熟悉HTTP协议的请求响应机制,能够处理常见的HTTP请求和响应;④掌握前端开发技术,如HTML、CSS、JavaScript等,能够进行简单的前端页面开发;⑤了解Tomcat服务器的工作原理及其配置方法。 阅读建议:本文内容丰富,涵盖了从后端到前端的多个方面,建议读者在学习过程中结合实际项目进行实践,尤其是在Maven项目管理和SSM框架的具体应用上,多动手操作,加深理解。同时,对于HTTP协议和前端开发技术,可以通过实际的网络请求和页面开发来巩固所学知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值