Android学习第五天————ExpandableListView组件通过适配器BaseExpandableListAdapter实现两层列表项

news/2024/7/7 8:06:04

ExpandableListView是对ListView的扩展,实现了当点击列表项时弹出下一层的列表项

同时它必须要通过相对应的适配器来实现数据的绑定

1、首先在布局文件中创建好组件


<ExpandableListView
	    android:id="@+id/extendview" 
	    android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/myspinner"
	    >
	    
	</ExpandableListView>
第一层

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ImageView 
        android:id="@+id/groupimage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
	<TextView 
	    android:id="@+id/grouptext"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_toRightOf="@id/groupimage"
	    />
</RelativeLayout>

第二层

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ImageView 
        android:id="@+id/childimage"
        android:layout_width="40dp"
        android:layout_height="40dp"
        />
	<TextView 
	    android:id="@+id/childtext"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_toRightOf="@id/childimage"
	    />
</RelativeLayout>
界面创建好之后,接下来通过java代码来实现数据绑定

2、数据绑定

自定义一个组件组类,用来封装需要显示在ExpandableListView中的组件

//自定义组件类
    public class MyView{
    	private ImageView imageView;
    	private TextView textView;
    }

定义一个方法用来封装向ExpandableListView的过程

//BaseExpandableListAdapter适配器向ExpandableListView填充数据,实现点击弹出下拉
    public void extendListView(){
    	//定义第一层的数据
    	final String[] textarr={"图片1","图片2","图片3","图片4"};//需要在textView中显示的数据
    	final int[] imgarr={R.drawable.iphone_we_flash,R.drawable.iphone_we_front,R.drawable.leica_active,R.drawable.leica_off};//需要显示的图片
    	//定义第二层数据
    	final String[][] childtextarr={{"图片1","图片2","图片3","图片4"},{"图片1","图片2","图片3","图片4"},{"图片1","图片2","图片3","图片4"},{"图片1","图片2","图片3","图片4"}};
    	final int[][] childimgarr={{R.drawable.iphone_we_flash,R.drawable.iphone_we_front,R.drawable.leica_active,R.drawable.leica_off},
    			{R.drawable.iphone_we_flash,R.drawable.iphone_we_front,R.drawable.leica_active,R.drawable.leica_off},
    			{R.drawable.iphone_we_flash,R.drawable.iphone_we_front,R.drawable.leica_active,R.drawable.leica_off},
    			{R.drawable.iphone_we_flash,R.drawable.iphone_we_front,R.drawable.leica_active,R.drawable.leica_off}
    			};
    	
    	//以匿名内部类的方式来获得BaseExpandableListAdapter适配器的对象
    	BaseExpandableListAdapter bAdapter=new BaseExpandableListAdapter() {
			
			@Override
			public boolean isChildSelectable(int groupPosition, int childPosition) {
				// TODO Auto-generated method stub
				return false;
			}
			
			@Override
			public boolean hasStableIds() {
				// TODO Auto-generated method stub
				return false;
			}
			//返回一个第一层的组件
			@Override
			public View getGroupView(int groupPosition, boolean isExpanded,
					View convertView, ViewGroup parent) {
				//创建一个自定义组件容器对象
				MyView myView=null;
				if(convertView==null){
					//将组件的XML布局文件转换为View 组件
					convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.group_view, null);
					myView=new MyView();
					myView.imageView=(ImageView)convertView.findViewById(R.id.groupimage);//获得转换得View的组件
					myView.textView=(TextView)convertView.findViewById(R.id.grouptext);
					convertView.setTag(myView);//将封装成对象的自定义组件对象设置为convertView的Tag
				}else{
					myView=(MyView) convertView.getTag();
				}
				myView.imageView.setImageResource(imgarr[groupPosition]);
				myView.textView.setText(textarr[groupPosition]);
				return convertView;
			}
			
			@Override
			public long getGroupId(int groupPosition) {
				// TODO Auto-generated method stub
				return groupPosition;
			}
			
			@Override
			public int getGroupCount() {
				// TODO Auto-generated method stub
				return imgarr.length;
			}
			
			@Override
			public Object getGroup(int groupPosition) {
				// TODO Auto-generated method stub
				return null;
			}
			
			@Override
			public int getChildrenCount(int groupPosition) {
				// TODO Auto-generated method stub
				return childimgarr[groupPosition].length;
			}
			
			@Override
			public View getChildView(int groupPosition, int childPosition,
					boolean isLastChild, View convertView, ViewGroup parent) {
				MyView myView=null;
				if(convertView==null){
					convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.child_view, null);
					myView=new MyView();
					myView.imageView=(ImageView)convertView.findViewById(R.id.childimage);
					myView.textView=(TextView)convertView.findViewById(R.id.childtext);
					convertView.setTag(myView);
				}else{
					myView=(MyView) convertView.getTag();
				}
				myView.imageView.setImageResource(childimgarr[groupPosition][childPosition]);
				myView.textView.setText(childtextarr[groupPosition][childPosition]);
				return convertView;
			}
			
			@Override
			public long getChildId(int groupPosition, int childPosition) {
				// TODO Auto-generated method stub
				return 0;
			}
			
			@Override
			public Object getChild(int groupPosition, int childPosition) {
				// TODO Auto-generated method stub
				return null;
			}
		};
		ExpandableListView e=(ExpandableListView)findViewById(R.id.extendview);
		e.setAdapter(bAdapter);
    }
至此已实现向ExpandableListView中填充数据







http://www.niftyadmin.cn/n/3654888.html

相关文章

关于char类型的取值范围

《高质量》一书page 104倒数第三行&#xff0c;说“char的取值范围为[-128, 127)”是不对的&#xff0c;正确的范围表示应该为[-128, 127]或者[-128, 128)。这是个笔误&#xff0c;特此更正&#xff01;感谢读者赵为民&#xff01;

Android学习第五天————AdapterViewFlipper组件

AdapterViewFlipper用来实现显示上一个组件&#xff0c;或显示下一个组件&#xff0c;或者自动播放组件 AdapterViewFlipper也是一个需要适配器来填充数据的组件 首先创建一个AdapterViewFlipper组件&#xff0c;同时添加几个按钮来实现显示上一个或下一个或自动播放的功能 …

两本小书的命运 --- 记《Effective STL》和《The Art Of Deception》两本书的出版翻译过程

这两年来&#xff0c;时常听到读者或者朋友们问我“最近还有新书要出版吗”&#xff0c;我的回答是&#xff0c;有两本拖了很久的书快要出版了。我乐观地估计&#xff0c;这两本书在2005年都能出版&#xff0c;然而&#xff0c;不幸的是&#xff0c;这两本书都未能如期出版。从…

Android学习第六天————android中数据存储的五种方式

数据的存取 1、通过键值对的形式来存读数据 SharedPreferences存储共享变量的文件路径位于“/data/data/应用程序包/shared_prefs”目录下 获取SharedPreferences的两种方式: 1 调用Context对象的getSharedPreferences()方法 2 调用Activity对象的getPreferences()方法 两种方式…

Android学习第七天————通过android提供的XmlPullParserFactory解析XML文件

示例代码 XML文件 <?xml version"1.0" encoding"UTF-8"?><users><user><name>小王</name><age>22</age></user><user><name>小李</name><age>23</age></user><…

关于《Visual C++技术内幕》(第四版)

书名&#xff1a;《Visual C技术内幕》&#xff08;第四版&#xff09;原作者&#xff1a;David J. Kruglinski翻译&#xff1a;潘爱民、王国印出版&#xff1a;清华大学出版社日期&#xff1a;1999年1月第1版价格&#xff1a;96元ISBN&#xff1a;ISBN 7-302-03243-2/TP.1738《…

Android学习第七天————将数据保存为JSON格式,通过JSONObject和JSONReader来解析JSON数据

一、将数据保存为JSON格式 //将数据用JSON写入文本public void jsonwrite() {// 创建一组姓名数据String[] nameArr new String[] { "小李", "萧晨", "小张", "小王" };// 创建一组年龄数据int[] ageArr new int[] { 23, 24, 22, 25…

Enhanced Assertions铪铪铪铪

Enhanced Assertions--By Andrei Alexandrescu and John Torjo刘未鹏&#xff08;pongba&#xff09;译 --这篇与John Torjo合著的文章描述了一个特性完备的&#xff0c;工业强度的assertion设施。这个工具包的特性包括多重debug级别&#xff0c;日志记录&#xff0c;还有一个搜…