Android开发之ExpandableListView的使用(一目了然版)
首先,通过ExpandableListView这个名字,我们就可以看得出这是一个可扩展的ListView,对于ListView我们就很清楚,不用太多的解释了!
由于本人测试的时候全部都是真机测试的,所以就不上图了,代码尽量详细些。。。
(如果大家想测试的话,直接可以把下面的两张图片复制粘贴到你的项目中,其它的代码直接用就ok了)
直接看代码讲解吧:
imagetodown.png:
imagetoright.png:
MainActivity.java:
package com.example.expandable_test; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.ExpandableListView; import android.widget.Toast; public class MainActivity extends Activity { private ExpandableListView listView=null; private My_Adapter adapter=null;//自定义的适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView=(ExpandableListView)findViewById(R.id.expandablelistview); adapter=new My_Adapter(this); listView.setAdapter(adapter); listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(MainActivity.this,"你点击了:"+adapter.getChild(groupPosition, childPosition).toString(), Toast.LENGTH_LONG).show(); return false; } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
然后是自己重写的适配器My_Adapter:
package com.example.expandable_test; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.TextView; public class My_Adapter extends BaseExpandableListAdapter { private Context context; private LayoutInflater father_Inflater=null; private LayoutInflater son_Inflater=null; private ArrayList<String> father_array;//父层 private ArrayList<List<String>> son_array;//子层 public My_Adapter(Context context) { this.context=context; father_Inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); son_Inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); Init_data(); }
//重写的方法,用于获取子层的内容,这里获取子层的显示字符串 @Override public Object getChild(int groupPosition, int childPosition) { return son_array.get(groupPosition).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) { Son_ViewHolder son_ViewHolder=null; if(convertView==null) { convertView=son_Inflater.inflate(R.layout.son, null); son_ViewHolder=new Son_ViewHolder(); son_ViewHolder.son_TextView=(TextView)convertView.findViewById(R.id.son_textview); convertView.setTag(son_ViewHolder); } else { son_ViewHolder=(Son_ViewHolder)convertView.getTag(); } son_ViewHolder.son_TextView.setText(son_array.get(groupPosition).get(childPosition)); return convertView; }
//重写的方法,用于获取父层中其中一层的子数目 @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return son_array.get(groupPosition).size(); }
//重写的方法,用于获取父层中的一项,返回的是父层的字符串类型 @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return father_array.get(groupPosition); }
//重写的方法,用于获取父层的大小 @Override public int getGroupCount() { // TODO Auto-generated method stub return father_array.size(); }
//重写的方法,用于获取父层的位置 @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; }
//重写的方法,用于获取父层的视图 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Father_ViewHolder father_ViewHolder=null; if(convertView==null) { convertView=father_Inflater.inflate(R.layout.father, null); father_ViewHolder=new Father_ViewHolder(); father_ViewHolder.father_TextView=(TextView)convertView.findViewById(R.id.father_textview); father_ViewHolder.image_view=(ImageView)convertView.findViewById(R.id.father_imageview); convertView.setTag(father_ViewHolder); } else { father_ViewHolder=(Father_ViewHolder)convertView.getTag(); } father_ViewHolder.father_TextView.setText(father_array.get(groupPosition)); if(isExpanded) { father_ViewHolder.image_view.setImageDrawable(context.getResources().getDrawable(R.drawable.imagetodown)); } else { father_ViewHolder.image_view.setImageDrawable(context.getResources().getDrawable(R.drawable.imagetoright)); } return convertView; }
//.... @Override public boolean hasStableIds() { // TODO Auto-generated method stub return true; }
//.... @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; }
//初始化数据,主要是父层和子层数据的初始化 public void Init_data() { father_array=new ArrayList<String>(); son_array=new ArrayList<List<String>>(); father_array.add("房产凭证"); father_array.add("二手汽车"); father_array.add("二手物品"); father_array.add("宠物及用品"); father_array.add("求职简介"); father_array.add("征婚交友"); List<String> one1=new ArrayList<String>(); one1.add("郊区"); one1.add("市区"); one1.add("农村"); one1.add("山区"); one1.add("海湾"); one1.add("岛屿"); one1.add("城镇"); son_array.add(one1); List<String> two1=new ArrayList<String>(); two1.add("大众"); two1.add("奔驰"); two1.add("QQ"); two1.add("西门子"); two1.add("东风"); son_array.add(two1); List<String> one2=new ArrayList<String>(); one2.add("手机"); one2.add("电脑"); one2.add("电视"); one2.add("冰箱"); one2.add("沙发"); one2.add("水杯"); son_array.add(one2); List<String> two2=new ArrayList<String>(); two2.add("妞妞"); two2.add("贝贝"); two2.add("朵朵"); two2.add("霍霍"); two2.add("花花"); two2.add("美美"); son_array.add(two2); List<String> one3=new ArrayList<String>(); one3.add("教师"); one3.add("会计"); one3.add("工程师"); one3.add("测试员"); son_array.add(one3); List<String> two3=new ArrayList<String>(); two3.add("兴趣交友"); two3.add("婚庆交友"); son_array.add(two3); } public final class Father_ViewHolder { private TextView father_TextView; private ImageView image_view; } public final class Son_ViewHolder { private TextView son_TextView; } }
看到适配器的内容,我们就应该很熟悉了,只要是方法实现部分前面有“@Override”的,就都是适配器自身含有的方法,我们所做的不过是重写这些方法进行实现而已!
接着,三个布局文件:
1.main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <ExpandableListView android:id="@+id/expandablelistview" android:layout_width="fill_parent" android:drawSelectorOnTop="false" android:layout_height="fill_parent" android:background="#ffffff" android:groupIndicator="@null" android:cacheColorHint="#00000000" android:listSelector="#00000000" //这个写出来主要是去除单击单项时点击处变黄一下的效果 ></ExpandableListView> </RelativeLayout>
2.father.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/father" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="60dp" > <TextView android:layout_alignParentLeft="true" android:textSize="25dp" android:id="@+id/father_textview"
android:layout_centerVertical="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_alignParentRight="true" android:layout_centerVertical="true" android:id="@+id/father_imageview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="15dip" android:src="@drawable/imagetoright" /> </RelativeLayout> </LinearLayout>
3.son.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/son" android:orientation="vertical" > <TextView android:id="@+id/son_textview" android:textSize="25dp" android:layout_width="fill_parent" android:layout_height="50dp" /> </LinearLayout>