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();
相关文章推荐
- [Android基础] 使用 ExpandableListView 展现分类数据
- Android ExpandableListview使用gson解析树形结构数据。
- Android中ExpandableListView的使用
- Android 事务操作和数据显示(ListView的使用)
- android开发之--ExpandableListView控件使用心得
- android ListView布局之三(使用自定义的Adapter绑定数据,通过contextView.setTag绑定数据)有按钮的ListView
- Android ExpandableListView的使用
- Android中ExpandableListView的使用
- Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据
- Android中ExpandableListView的使用
- android之 ExpandableListView的使用
- Android中ExpandableListView的使用
- Android ExpandableListView的使用
- 【android动态布局】之【ListView动态加载数据模板(使用xml布局)】
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- Android开发之ExpandableListView扩展(BaseExpandableListAdapter的使用)(完整版)
- Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据
- android ExpandableListView使用
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- Android中ExpandableListView的使用