文档章节

Android ExpandableListView的使用

汇聚成河
 汇聚成河
发布于 2017/07/12 17:14
字数 849
阅读 10
收藏 0
点赞 0
评论 0

(文中说的一级标签二级标签也就是所谓的父级和子级) 在Android开发中会遇到点击时弹出二级标签的效果,可以使用Android自带的ExpandableListView,其用法跟Listview类似,不同点在于其使用的Adapter中需要重写的内容比较多。其中Adapter分为BaseExpandableListAdapter和ExpandableListAdapter,BaseExpandableListAdapter扩展了ExpandableListAdapter,使用起来也更加方便,可以刷新adapter,判断一级标签总数大小是否为0. 其中继承自ExpandableListAdapter的写法如下:

package com.okkuaixiu.combo.adapter;

import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;

public class MyExpandListAdapter implements ExpandableListAdapter{

    private ArrayList<AddQuotationBean.ASQuotations> list_quotation;//一级标签的数据源
    private ArrayList<ArrayList<AddQuotationBean.QDetails>> listsQDetail;//二级标签
    private Context context;

    public MyExpandListAdapter(ArrayList<AddQuotationBean.ASQuotations> list_quotation, Context context) {
        this.list_quotation = list_quotation;
        this.context = context;
        //为二级标签添加数据
        if (list_quotation != null && list_quotation.size() > 0) {
            listsQDetail = new ArrayList<>();
            for (AddQuotationBean.ASQuotations asquotations:
                    list_quotation) {
                listsQDetail.add(asquotations.QDetails);
            }
        }
    }

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {

    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {

    }

    //获取一级标签总数
    @Override
    public int getGroupCount() {
        return list_quotation.size();
    }

    //获取二级标签总数
    @Override
    public int getChildrenCount(int groupPosition) {
        return listsQDetail.size();
    }

    //获取一级标签内容
    @Override
    public Object getGroup(int groupPosition) {
        return list_quotation.get(groupPosition);
    }

    //获取二级标签内容
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return listsQDetail.get(groupPosition).get(childPosition);
    }

    //获取一级标签的ID
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    //获取二级标签的ID
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    //指定位置相应的组视图
    @Override
    public boolean hasStableIds() {
        return true;
    }

    //对一级标签进行设置
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        // 为视图对象指定布局
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_price_menu_detail, null);
            viewHolder = new ViewHolder();
            viewHolder.tv_space_name = (TextView) convertView.findViewById(R.id.price_detail_space_name);
            viewHolder.tv_diff_sum = (TextView) convertView.findViewById(R.id.price_detail_diff);
            viewHolder.item_price_linelayout = (View) convertView.findViewById(R.id.item_price_linelayout);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        AddQuotationBean.ASQuotations asQuotations = list_quotation.get(groupPosition);
        viewHolder.tv_space_name.setText(asQuotations.SpaceName);
        viewHolder.tv_diff_sum.setText("¥" + Util.getNonScientificCount(asQuotations.SpaceTotalMoney + "", true));
        //二级标签是否展开
        if (isExpanded) {
            viewHolder.item_price_linelayout.setVisibility(View.GONE);
        } else {
            viewHolder.item_price_linelayout.setVisibility(View.VISIBLE);
        }

        return convertView;
    }

    //一级标签对应的内部类
    private class ViewHolder{
        private TextView tv_space_name;// 空间名
        private TextView tv_diff_sum;// 差价小计
        private View item_price_linelayout;//底部分割布局
        private LinearLayout ll_info;// 材料信息
        private RelativeLayout price_detail_layout;//空间名和差价小计整体的布局
    }
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        try {
            ChildViewHolder childViewHolder = null;
            if (convertView == null) {
                childViewHolder = new ChildViewHolder();
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.item_price_menu_detail_info, null);
                childViewHolder.detail_construct_name = (TextView) convertView.findViewById(R.id.info_construct_name);//施工项目
                childViewHolder.detail_material_name = (TextView) convertView.findViewById(R.id.info_material_name);//材料名称
                childViewHolder.detail_material_brand = (TextView) convertView.findViewById(R.id.info_brand);//材料品牌
                childViewHolder.detail_material_model = (TextView) convertView.findViewById(R.id.info_model);//材料型号
                childViewHolder.detail_diff = (TextView) convertView.findViewById(R.id.info_price_diff);//单位差价
                childViewHolder.detail_count = (TextView) convertView.findViewById(R.id.info_count);//数量
                childViewHolder.item_price_info_linelayout = (View) convertView.findViewById(R.id.item_price_info_linelayout);// 底部间隔布局
                convertView.setTag(childViewHolder);
            } else {
                childViewHolder = (ChildViewHolder) convertView.getTag();
            }
            //当二级标签的内容展开时再显示间隔布局
            if (isLastChild) {
                childViewHolder.item_price_info_linelayout.setVisibility(View.VISIBLE);
            } else {
                childViewHolder.item_price_info_linelayout.setVisibility(View.GONE);
            }
            AddQuotationBean.QDetails qDetails = listsQDetail.get(groupPosition).get(childPosition);
            childViewHolder.detail_construct_name.setText(qDetails.ConstructionName);
            childViewHolder.detail_material_name.setText(qDetails.MateralName);
            childViewHolder.detail_material_brand.setText(qDetails.BrandName);
            childViewHolder.detail_material_model.setText(qDetails.MateralCode);
            childViewHolder.detail_diff.setText("¥" + Util.getNonScientificCount(qDetails.Difference + "", true));
            childViewHolder.detail_count.setText(qDetails.DMNumber + (!Util.isTextNull(qDetails.Unit) ? qDetails.Unit : ""));
        } catch (Exception e) {
            LogUtil.e(getClass(), "getChildView", e);
        }
        return convertView;
    }
    //二级标签对应的内部类
    private class ChildViewHolder{
        private TextView detail_construct_name;// 施工项目
        private TextView detail_material_name;//材料名称
        private TextView detail_material_brand;//材料品牌
        private TextView detail_material_model;//材料型号
        private TextView detail_diff;//单位差价
        private TextView detail_count;//数量
        private View item_price_info_linelayout;// 底部间隔布局
    }

    //子列表项是否能否触发事件,返回true则为可以响应点击 
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public void onGroupExpanded(int groupPosition) {

    }

    @Override
    public void onGroupCollapsed(int groupPosition) {

    }

    @Override
    public long getCombinedChildId(long groupId, long childId) {
        return 0;
    }

    @Override
    public long getCombinedGroupId(long groupId) {
        return 0;
    }
}

代码注释如上。 针对ExpandableListView的属性有一些要说明的地方有:android:groupIndicator="@null"表示去掉默认的图标箭头。如果设置了android:divider,那么其一级标签和二级标签中都会出现

© 著作权归作者所有

共有 人打赏支持
汇聚成河
粉丝 1
博文 28
码字总数 22144
作品 0
浦东
程序员
Android expandablelistview数据绑定的问题

我使用runOnUiThread来执行异步任务AsyncTask,并在AsyncTask中更新expandablelistview,为什么expandablelistview只显示了一条getGroupView?点击它的时候没有调用getChildView,这是什么情...

kycp1 ⋅ 04/26 ⋅ 0

android ExpandableListView ExpandableListAdapter使用

目前大家都在使用ExpandableListView完成一些特效,目前大多数程序在显示都没有问题,但是在处理数据的时候出现问题,本人使用自定义的显示模式及数据,单介绍这个空间的使用。 首先看主xml...

zhouhb1 ⋅ 2011/11/22 ⋅ 0

android--------ExpandableListView的使用多级列表

多级列表ExpandableListView 扩展列表能够显示一个指示在每项显示项的当前状态(状态通常是一个扩展的组,组的孩子,或倒塌,最后一个孩子)。使用setchildindicator(drawable)或setgroupi...

切切歆语 ⋅ 2016/12/05 ⋅ 0

Android 关于ExpandableListView二级菜单的问题

下面是代码:activity_main.xml 父布局lv_group.xml 子布局lv_children.xml 下面是主代码: 效果:

ForingY ⋅ 2016/12/09 ⋅ 0

android ExpandableListView

为什么ExpandableListView中除第一个item可见,其它只要有一个不可见,第一个item就变成不可见。 为什么点击ExpandableListview中上的箭头,例如第一次点击是1,2,3,4。第二次点击是4,3,...

HappyLin ⋅ 2016/06/29 ⋅ 0

ExpandableListView滚动时颜色改变(不是变黑)怎么解决?

不是变黑!就是滚动时颜色会变化,很是影响视觉效果! 简化了的源码如下: 主程序: import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.con...

书牍时光 ⋅ 2013/07/21 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

android--------ListView和ExpandableListView的侧滑删除操作

本案例主要实现了ListView和ExpandableListView的侧滑删除操作功能 效果图: 代码:

切切歆语 ⋅ 2016/11/29 ⋅ 0

android:excludeFromRecents 属性需要注意的小地方

在 Android 系统中,如果我们不想某个 Activity 出现在 “Recent screes” 中,可以设置 属性 android:excludeFromRecents 为 true。其中有些需要注意到的地方说明下。 android:excludeFromR...

夏洛克的喵 ⋅ 06/12 ⋅ 0

加密传输才是王道!谷歌在 Android P 上默认启用 TLS

上周四谷歌表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 ...

局长 ⋅ 04/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 40分钟前 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 45分钟前 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 48分钟前 ⋅ 0

Webpack 4 api 了解与使用

webpack 最近升级到了 v4.5+版 01 官方不再支持 node4 以下版本 官方不再支持 node4 以下版本官方不再支持 node4 以下的版本,所以如果你的node版本太低,先开始升级node吧!话说node10 ...

NDweb ⋅ 57分钟前 ⋅ 0

使用nodeJs安装Vue-cli

Vue脚手架就是一个Vue框架开发环境 脚手架的意思是帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要 npm install就可以安装,让我们不需要为了编辑或者一些其...

木筏笔歆 ⋅ 今天 ⋅ 0

【微信小程序开发实战】0x00.开发前准备工作

写在开始 本人资深后端码农一枚,近期项目需求,接触到了微信小程序,将学习过程整理成文分享给小伙伴们,由于是边学边整理难免有表述不对的地方,望大家及时指正,感谢。 本人微信号: dream...

dreamans ⋅ 今天 ⋅ 0

linux redis的安装和php7下安装redis扩展

安装redis服务器 (1)下载安装包: $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz (2)编译程序: $ tar xzf redis-2.8.17.tar.gz $ cd redis-2.8.17 $ make $ cd src &&......

concat ⋅ 今天 ⋅ 0

Guava EventBus源码解析

一、EventBus使用场景示例 Guava EventBus是事件发布/订阅框架,采用观察者模式,通过解耦发布者和订阅者简化事件(消息)的传递。这有点像简化版的MQ,除去了Broker,由EventBus托管了订阅&...

SaintTinyBoy ⋅ 今天 ⋅ 0

http怎么做自动跳转https

Apache 版本 如果需要整站跳转,则在网站的配置文件的<Directory>标签内,键入以下内容: RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME......

Helios51 ⋅ 今天 ⋅ 0

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部