文档章节

Android ExpandableListView的使用

汇聚成河
 汇聚成河
发布于 2017/07/12 17:14
字数 849
阅读 11
收藏 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
博文 30
码字总数 22144
作品 0
浦东
程序员
android ExpandableListView图标的自定义

在ExpandableListView的xml文件内设置 android:groupIndicator属性 自定义一个xml seletor <item android:stateexpanded="true" android:drawable="@drawable/iconexdown"/> <item android:......

广阔
2012/11/07
0
0
Android之微信朋友圈UI实现--ExpandableListView+GridView

PS:我们都知道微信,更是知道朋友圈,很多人在朋友圈里卖起了化妆品,打入广告等为自己做一下推广,里面会附带一写好看的图片,上面有标题,有描述,整体布局每场的美观,那么这是怎么实现的...

cmusketeer
07/16
0
0
view-ListView学习

LiastView网上有很多,推荐如下: 1、android ListView详解: http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 2、Android中ListView的性能问题 http://android.tgbus.com/A......

工作日
2011/12/27
0
0
android 实现QQ好友列表(扩展listview:ExpandableListView)

某些android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的。接触Android,也才一年的时间,大部分时间花在工作上(解bug。。。),界面上开发很少参与。自己维护的系统应...

天下杰论
2013/02/05
0
0
Android开发优秀博文收录

Android 完美实现图片圆角和圆形(对实现进行分析) 2.Android之Loader理解 3.Android Loader详解一:概述 4. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅 5. And...

JayPark不作死
2014/09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 反向跟踪

当反向跟踪(Trackback )被启用后,在任何你链接到可用启用自动发现功能的外部页面中,Confluence 将会自动发送一个方向跟踪 ping,这个 ping 能通知链接的页面有了内容改变。 Confluence 页...

honeymose
昨天
0
0
日期和时间API - 读《Java 8实战》

日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期LocalDate date1 = LocalDate.of(2014, 3, 18);// 读取System.out.println(date1.getYear()); // 2014Sys...

yysue
昨天
0
0
8月15日任务

8月15日任务 Memcached命令行 • telnet 127.0.0.1 11211 • set key2 0 30 2 ab STORED get key2 VALUE key2 0 2 ab END 实例: [root@localhost 02]# telnet 127.0.0.1 11211-bash: te......

寰宇01
昨天
1
0
LNMP架构(Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间)

Nginx访问日志 1.打开配置文件,搜索log_format vim /usr/local/nginx/conf/nginx.conf 2.访问日志常用变量含义 $remote_addr : 客户端IP(公网IP) $http_x_forwarded_for : 代理服务器的IP ...

蛋黄_Yolks
昨天
0
0
lombok 不用再写pojo的getset

java实体类不写get/set方法 1、下载地址https://projectlombok.org/download Myeclipse、eclipse安装lombok Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网...

木之下
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部