您的位置:首页 > 移动开发 > Android开发

Android ExpandableListView使用(1):使用二维数组封装数据

2018-03-20 17:30 531 查看

ExpandableListView 是什么?

一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选项。这些选项的数据是通过 ExpandableListAdapter 关联的。

效果图:



1.布局文件:

<ExpandableListView
android:id="@+id/expand_listview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ExpandableListView>


常用属性:

自定义指示器:


android:groupIndicator="@drawable/group_indicator"


去掉指示器:

android:groupIndicator="@null"


设置点击item项后该item项的背景色:

android:listSelector="#00000000"


设置同一个父项下,子类之间的分割线的样式:

android:childDivider="@color/blue_700"


分割线高度:

android:dividerHeight="1dp"


2.二维数组封装数据:

public String[] groupData = {"第一组", "第二组", "第三组", "第四组"};

public String[][] childData = {
{"第一组——01", "第一组——02", "第一组——03", "第一组——04"},
{"第二组——01", "第二组——02", "第二组——03", "第一组——04"},
{"第三组——01", "第三组——02", "第三组——03", "第三组——04"},
{"第四组——01", "第四组——02", "第四组——03", "第四组——04"}
};


3.定义分组的视图和子选项的视图

组条目视图:

<?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="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/tv_group_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@android:color/holo_blue_light"
android:paddingLeft="30dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:textColor="@android:color/white"
android:textSize="20sp" />

</LinearLayout>


子条目视图:

<?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="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/tv_child_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:paddingLeft="20dp"
android:text="11"
android:textSize="20sp" />

</LinearLayout>


4.Activity代码:

package com.xiaoyehai.expandablelistviewdemo.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import com.xiaoyehai.expandablelistviewdemo.R;
import com.xiaoyehai.expandablelistviewdemo.adapter.Main2Adapter;

/**
* 使用二维数组封装数据
*/
public class Main2Activity extends AppCompatActivity {

private ExpandableListView mExpandableListView;

private Main2Adapter mMain2Adapter;

public String[] groupData = {"第一组", "第二组", "第三组", "第四组"};

public String[][] childData = {
{"第一组——01", "第一组——02", "第一组——03", "第一组——04"},
{"第二组——01", "第二组——02", "第二组——03", "第一组——04"},
{"第三组——01", "第三组——02", "第三组——03", "第三组——04"},
{"第四组——01", "第四组——02", "第四组——03", "第四组——04"}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);

mExpandableListView = (ExpandableListView) findViewById(R.id.expand_listview);

mMain2Adapter = new Main2Adapter(this, groupData, childData);

mExpandableListView.setAdapter(mMain2Adapter);

mExpandableListView.expandGroup(0); //设置默认展开

initListener();

}

private void initListener() {
/**
*  设置分组项的点击监听事件
*/
mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long id) {
Toast.makeText(getApplicationContext(), groupData[groupPosition], Toast.LENGTH_SHORT).show();
// 请务必返回 false,否则分组不会展开
return false;
}
});

/**
*  设置子选项点击监听事件
*/
mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(getApplicationContext(), childData[groupPosition][childPosition], Toast.LENGTH_SHORT).show();
return true;
}
});

/**
* 分组展开的监听事件
*/
mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {

}
});

/**
* 分组合并的监听事件
*/
mExpandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {

}
});
}
}


5.adapte适配器,继承BaseExpandableListAdapter :

package com.xiaoyehai.expandablelistviewdemo.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

import com.xiaoyehai.expandablelistviewdemo.R;

/**
* Created by xiaoyehai on 2018/3/15 0015.
*/

public class Main2Adapter extends BaseExpandableListAdapter {

private Context mContext;
private String[] groupData;
private String[][] childData;

public Main2Adapter(Context context, String[] groupData, String[][] childData) {
mContext = context;
this.groupData = groupData;
this.childData = childData;
}

/**
* 获取分组的个数
*
* @return
*/
@Override
public int getGroupCount() {
return groupData.length;
}

/**
* 获取指定分组中的子选项的个数
*
* @param groupPosition
* @return
*/
@Override
public int getChildrenCount(int groupPosition) {
return groupData[groupPosition].length();
}

/**
* 获取指定的分组数据
*
* @param groupPosition
* @return
*/
@Override
public Object getGroup(int groupPosition) {
return groupData[groupPosition];
}

/**
* 获取指定分组中的指定子选项数据
*
* @param groupPosition
* @param childPosition
* @return
*/
@Override
public Object getChild(int groupPosition, int childPosition) {
return childData[groupPosition][childPosition];
}

/**
* 获取指定分组的ID, 这个ID必须是唯一的
*
* @param groupPosition
* @return
*/
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}

/**
* 获取子选项的ID, 这个ID必须是唯一的
*
* @param groupPosition
* @param childPosition
* @return
*/
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}

/**
* 分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们。
*
* @return
*/
@Override
public boolean hasStableIds() {
return true;
}

/**
* 获取显示指定分组的视图
*
* @param groupPosition
* @param isExpanded    是否展开
* @param convertView
* @param parent
* @return
*/
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupViewHolder;
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.item_expand_group, null);
groupViewHolder = new GroupViewHolder(convertView);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
groupViewHolder.tvTitle.setText(groupData[groupPosition]);
return convertView;
}

/**
* 获取显示指定分组中的指定子选项的视图
*
* @param groupPosition
* @param childPosition
* @param isLastChild
* @param convertView
* @param parent
* @return
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder childViewHolder;
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.item_expand_child, null);
childViewHolder = new ChildViewHolder(convertView);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
childViewHolder.tvTitle.setText(childData[groupPosition][childPosition]);
return convertView;

}

/**
* 子项是否可选中,如果需要设置子项的点击事件,需要返回true
*
* @param groupPosition
* @param childPosition
* @return
*/
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}

static class GroupViewHolder {
private TextView tvTitle;

public GroupViewHolder(View convertView) {
tvTitle = (TextView) convertView.findViewById(R.id.tv_group_title);
}
}

static class ChildViewHolder {
private TextView tvTitle;

public ChildViewHolder(View convertView) {
tvTitle = (TextView) convertView.findViewById(R.id.tv_child_title);
}
}
}


6.可以自定义箭头的位置和箭头图片

(1)改变默认指示器图片

android:groupIndicator="@drawable/group_indicator"


<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_expand" android:state_expanded="true"/>
<item android:drawable="@mipmap/ic_collapse"/>
</selector>


<ExpandableListView
android:id="@+id/expand_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:groupIndicator="@drawable/group_indicator"
android:indicatorLeft="0dp"
android:indicatorRight="40dp"
/>


(2)去掉默认指示器,自定义指示器位置和图片

android:groupIndicator="@null" :去掉默认指示器

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

convertView = View.inflate(parent.getContext(), R.layout.item_group_layer_popup_window, null);
TextView tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
ImageView ivArrow = (ImageView) convertView.findViewById(R.id.iv_arrow);

tvTitle.setText(groupList.get(groupPosition).getName());

//是否展开
if (isExpanded) {
ivArrow.setImageResource(R.drawable.ic_expand_up);
} else {
ivArrow.setImageResource(R.drawable.ic_expand_down);
}
return convertView;
}


7.更新数据:

mMain2Adapter.notifyDataSetChanged();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息