展会信息港展会大全

android ExpandableListView详解
来源:互联网   发布日期:2015-11-25 22:45:49   浏览:3471次  

导读:ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。重要方法:expandGroup (int groupPos......

ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。

重要方法:

expandGroup (int groupPos) ;//在分组列表视图中 展开一组,

setSelectedGroup (int groupPosition) ;//设置选择指定的组。

setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//设置选择指定的子项。

getPackedPositionGroup (long packedPosition);//返回所选择的组

getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所选择的子项

getPackedPositionType (long packedPosition);//返回所选择项的类型(Child,Group)

isGroupExpanded (int groupPosition);//判断此组是否展开

expandableListView.setDivider();这个是设定每个Group之间的分割线。

expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。

expandableListView.collapseGroup(int group); 将第group组收起

ExpandableListAdapter

一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。

1.重要方法

getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。

getChildrenCount (int groupPosition) 返回在指定Group的Child数目。

案例:

首先定义个一个布局文件expandablelistview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<ExpandableListView

android:id ="@+id/expandableListView"

android:layout_width ="fill_parent"

android:layout_height ="wrap_content"

>

</ExpandableListView>

</LinearLayout>

package com.test;

import java.util.ArrayList;

import java.util.List;

import javax.security.auth.PrivateCredentialPermission;

import android.app.Activity;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.view.Window;

import android.widget.AbsListView;

import android.widget.BaseExpandableListAdapter;

import android.widget.ExpandableListView;

import android.widget.TextView;

public class ExpandableListViewDemo extends Activity {

/** Called when the activity is first created. */

//定义两个List用来控制Group和Child中的String;

private List<String> groupArray;//组列表

private List<List<String>> childArray;//子列表

private ExpandableListView expandableListView_one;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// requestWindowFeature(Window.FEATURE_NO_TITLE); //设置为无标题

setContentView(R.layout.expandablelistview);

expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);

groupArray =new ArrayList<String>();

childArray = new ArrayList<List<String>>();

/*-第一季-*/

initdate();

expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));

/*-第二季-*/

// groupArray.add("移动开发");

// List<String> arrayList = new ArrayList<String>();

// arrayList.add("Android");

// arrayList.add("IOS");

// arrayList.add("Windows Phone");

// //组循环

// for(int index=0;index<groupArray.size();++index)

// {

// childArray.add(arrayList);

// }

// expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));

}

class ExpandableListViewaAdapter extends BaseExpandableListAdapter {

Activity activity;

public ExpandableListViewaAdapter(Activity a)

{

activity = a;

}

/*-----------------Child */

@Override

public Object getChild(int groupPosition, int childPosition) {

// TODO Auto-generated method stub

return childArray.get(groupPosition).get(childPosition);

}

@Override

public long getChildId(int groupPosition, int childPosition) {

// TODO Auto-generated method stub

return childPosition;

}

@Override

public View getChildView(int groupPosition, int childPosition,

boolean isLastChild, View convertView, ViewGroup parent) {

String string =childArray.get(groupPosition).get(childPosition);

return getGenericView(string);

}

@Override

public int getChildrenCount(int groupPosition) {

// TODO Auto-generated method stub

return childArray.get(groupPosition).size();

}

/* ----------------------------Group */

@Override

public Object getGroup(int groupPosition) {

// TODO Auto-generated method stub

return getGroup(groupPosition);

}

@Override

public int getGroupCount() {

// TODO Auto-generated method stub

return groupArray.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) {

String string=groupArray.get(groupPosition);

return getGenericView(string);

}

@Override

public boolean hasStableIds() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isChildSelectable(int groupPosition, int childPosition)

{

// TODO Auto-generated method stub

return true;

}

private TextView getGenericView(String string )

{

AbsListView.LayoutParams layoutParams =new AbsListView.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

TextView textView =new TextView(activity);

textView.setLayoutParams(layoutParams);

textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);

textView.setPadding(40, 0, 0, 0);

textView.setText(string);

return textView;

}

}

private void initdate()

{

addInfo("语言", new String[]{"Oracle","Java","Linux","Jquery"});

addInfo("男人的需求", new String[]{"金钱","事业","权力","女人","房子","车","球"});

}

private void addInfo(String group,String []child) {

groupArray.add(group);

List<String> childItem =new ArrayList<String>();

for(int index=0;index<child.length;index++)

{

childItem.add(child[index]);

}

childArray.add(childItem);

}

}

运行效果:

\

注释修改如下代码:

/*-第一季-*/

// initdate();

// expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));

/*-第二季-*/

groupArray.add("移动开发");

List<String> arrayList = new ArrayList<String>();

arrayList.add("Android");

arrayList.add("IOS");

arrayList.add("Windows Phone");

//组循环

for(int index=0;index<groupArray.size();++index)

{

childArray.add(arrayList);

}

expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));

运行效果:

\

★★★★★★★★★★★★★★★★★★★★

案例二:

1.定义一个主界面expandablelistview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<ExpandableListView

android:id ="@+id/expandableListView"

android:layout_width ="fill_parent"

android:layout_height ="wrap_content"

>

</ExpandableListView>

</LinearLayout>

2.在res/drawable目录下创建样式文件expandablelistview_groups.xml该界面是组界面:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:id="@+id/textGroup"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:paddingLeft="40px"

android:paddingTop="6px"

android:paddingBottom="6px"

android:textSize="15sp"

android:text="No data"

>

</TextView>

</LinearLayout>

3.在res/drawable目录下创建样式文件expandablelistview_child.xml;是子控件,直接显示列表内容

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:id="@+id/textChild"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:paddingLeft="60px"

android:paddingTop="10px"

android:paddingBottom="10px"

android:textSize="20sp"

android:text="No Data" />

</LinearLayout>

定义java文件:ExpandableListViewDemo_two.java

package com.test;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.security.auth.PrivateCredentialPermission;

import com.test.R;

import com.test.ExpandableListViewDemo.ExpandableListViewaAdapter;

import com.test.R.id;

import com.test.R.layout;

import android.app.Activity;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.view.Window;

import android.widget.AbsListView;

import android.widget.BaseExpandableListAdapter;

import android.widget.ExpandableListView;

import android.widget.SimpleExpandableListAdapter;

import android.widget.TextView;

public class ExpandableListViewDemo_two extends Activity {

/** Called when the activity is first created. */

private ExpandableListView expandableListView_one;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.expandablelistview);

expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);

//创建二个一级条目标题

Map<String, String> title_1 = new HashMap<String, String>();

Map<String, String> title_2 = new HashMap<String, String>();

title_1.put("group", "移动开发");

title_2.put("group", "男人的需求");

//创建一级条目容器

List<Map<String, String>> gruops = new ArrayList<Map<String,String>>();

gruops.add(title_1);

gruops.add(title_2);

//创建二级条目内容

//内容一

Map<String, String> content_1 = new HashMap<String, String>();

Map<String, String> content_2 = new HashMap<String, String>();

content_1.put("child", "ANDROID");

content_2.put("child", "IOS");

List<Map<String, String>> childs_1 = new ArrayList<Map<String,String>>();

childs_1.add(content_1);

childs_1.add(content_2);

//内容二

Map<String, String> content_3 = new HashMap<String, String>();

Map<String, String> content_4 = new HashMap<String, String>();

Map<String, String> content_5 = new HashMap<String, String>();

content_3.put("child", "金钱");

content_4.put("child", "权力");

content_5.put("child", "女人");

List<Map<String, String>> childs_2 = new ArrayList<Map<String,String>>();

childs_2.add(content_3);

childs_2.add(content_4);

childs_2.add(content_5);

//存放两个内容, 以便显示在列表中

List<List<Map<String, String>>> childs = new ArrayList<List<Map<String,String>>>();

childs.add(childs_1);

childs.add(childs_2);

//创建ExpandableList的Adapter容器

/**

* 使用SimpleExpandableListAdapter显示ExpandableListView

* 参数1.上下文对象Context

* 参数2.一级条目目录集合

* 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件

* 参数4.fromto,就是map中的key,指定要显示的对象

* 参数5.与参数4对应,指定要显示在groups中的id

* 参数6.二级条目目录集合

* 参数7.二级条目对应的布局文件

* 参数9.与参数8对应,指定要显示在childs中的id

/ SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(

this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup},

childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild}

);

//加入列表

expandableListView_one.setAdapter(adapter);

expandableListView_one.setOnChildClickListener(listener);

}

private OnChildClickListener listener =new OnChildClickListener() {

@Override

public boolean onChildClick(ExpandableListView parent, View v,

int groupPosition, int childPosition, long id) {

// TODO Auto-generated method stub

toast("点击了");

return false;

}

};

private void toast(String str) {

Toast.makeText(this, str, Toast.LENGTH_LONG).show();

}

}

上面的样式也可以使用系统的自带的样式如下:

android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义

android.R.layout.simple_expandable_list_item_2,

运行效果:

\

案例三:如果group中有个ImageVIew将会是什么情况呢?

在SimpleExpandableListAdapter中有如下方法:

private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {

int len = to.length;

for (int i = 0; i < len; i++) {

TextView v = (TextView)view.findViewById(to[i]);

if (v != null) {

v.setText((String)data.get(from[i]));

}

}

}

从上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都当成TextView来处理了,而不像SimpleAdapter可以自动判断View的类型,自动绑定,解决版本就是重写bingview回调一下试试:

public class MyExpandableListAdapter extends BaseExpandableListAdapter{

private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {

int len = to.length;

boolean isBound = false;

for (int i = 0; i < len; i++) {

final View v = view.findViewById(to[i]);

if (v!=null) {

final Object _data = data.get(from[i]);

String text = _data == null ? "" : data.toString();

if (text == null) {

text = "";

}

if (mViewBinder != null) {//如果Binder不为空,使用Binder进行处理

isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);

}

if (!isBound) {//如果Binder跳过,使用原来的方法进行处理

TextView _v = (TextView)v;

_v.setText((String)data.get(from[i]));

}

}

}

}

}

赞助本站

人工智能实验室

相关热词: ExpandableListView

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港