android ExpandableListView

来源:互联网 发布:linux vim替换命令 编辑:程序博客网 时间:2024/05/21 17:32

 一,简介:

     1,(借用) ExpandableListView组件是android中一个比较常用的组件,当点击一个父item的时候可以将它的子item显示出来,像手机                QQ中的好友列表就是实现的类型效果。

    2, 使用ExpandableListView组件的关键就是设置它的adapter,这个adapter必须继承BaseExpandbaleListAdapter类,所以实现运用                ExpandableListView的核心就是学会继承这个BaseExpanableListAdapter类。

    

二,使用步骤:(附源码 demo)

   1,在main.xml中创建 一个 ExpandableListView如下:                   

 <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"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <ExpandableListView        android:id="@+id/expandableListView"        android:layout_width="wrap_content"        android:layout_height="wrap_content" >    </ExpandableListView></RelativeLayout>
     新建一个  list_item.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"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

    2,mainActivity.java

package com.expandablelistview.guo;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.ExpandableListView;import android.widget.ExpandableListView.OnChildClickListener;import android.widget.Toast;import com.listviewdemo_expandablelistview.R;public class MainActivity extends Activity {private ExpandableListView listView;private List<String> group;private List<List<String>> child;private MyAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ExpandableListView) findViewById(R.id.expandableListView);//初始化数据 group = new ArrayList<String>();child = new ArrayList<List<String>>();addInfo("北京",new String[]{"朝阳","海淀","东城区","西城区"});addInfo("河北", new String[]{"邯郸","石家庄","邢台"});addInfo("广东", new String[]{"广州","深圳","珠海"});adapter = new MyAdapter(this,group,child);listView.setAdapter(adapter);//处理单击子项的事件。listView.setOnChildClickListener(new OnChildClickListener(){                        @Override                      public boolean onChildClick(ExpandableListView arg0, View arg1,                              int parent, int children, long arg4) {                                                    String str="parent id:"+String.valueOf(parent)+",children id:"+String.valueOf(children);                          Toast.makeText(MainActivity.this,"你单击了:"+ str, 300).show();                          return false;                      }                  });} //添加数据信息private void addInfo(String g,String[] c) {group.add(g);List<String> list = new ArrayList<String>();for (int i = 0; i < c.length; i++) {list.add(c[i]);}child.add(list);}}

3,适配器 MyAdapter.java

     MyAdapter继承结构:

       MyAdapter extends BaseExpandableListAdapter 。
       BaseExpandableListAdapter implements ExpandableListAdapter, HeterogeneousExpandableList。
import java.util.List;import com.listviewdemo_expandablelistview.R;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseExpandableListAdapter;import android.widget.TextView;//expandableListView适配器public class MyAdapter extends BaseExpandableListAdapter {private Context context;private List<String> group;private List<List<String>> child;public MyAdapter(Context context, List<String> group,List<List<String>> child) {this.context = context;this.group = group;this.child = child;}@Overridepublic int getGroupCount() {return group.size();}//获取当前父item的数据@Overridepublic Object getGroup(int groupPosition) {return group.get(groupPosition);} //获取当前父item下的子item的个数@Overridepublic int getChildrenCount(int groupPosition) {return child.size();} //得到子item需要关联的数据@Overridepublic Object getChild(int groupPosition, int childPosition) {return child.get(childPosition).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}//得到子item的ID@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}//hasStableIds的作用:指baseadapter的刷新顺序问题,即long getItemId(int position)boolean hasStableIds()getItemId;在调用 invalidateView()时,ListView会刷新显示内容。如果内容的id是有效的,系统会跟据id来确定当前显示哪条内容,也就是firstVisibleChild的位置。而id是否有效通过hasStableIds()确定。@Overridepublic boolean hasStableIds() {return false;}//显示:group ,设置父item组件@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);holder = new ViewHolder();holder.textView = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.textView.setText(group.get(groupPosition));holder.textView.setTextSize(25);holder.textView.setPadding(36, 10, 0, 10);return convertView;}//显示:child  ,设置子item的组件@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);holder = new ViewHolder();holder.textView = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.textView.setText(child.get(groupPosition).get(childPosition));holder.textView.setTextSize(20);holder.textView.setPadding(72, 10, 0, 10);return convertView;}//class ViewHolder {TextView textView;}//当选择子节点的时候,被调用 返回true@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}}


参考了其他资源,有问题可与我联系qq:1096392534或群112383348,多多指教。

demo源码下载地址:http://download.csdn.net/detail/gudu1289/9271879

 二级菜单和三级菜单源码下载地址:  http://download.csdn.net/detail/gudu1289/9271975   

  级联菜单源码下载地址:  http://download.csdn.net/detail/gudu1289/9272007

0 0
原创粉丝点击