热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android中使用ExpandableListView实现分组的实例

这篇文章主要介绍了Android中使用ExpandableListView实现分组的实例的相关资料,这里提供实例代码及实现效果图,需要的朋友可以参考下

 Android 中使用ExpandableListView 实现分组

一个视图显示垂直滚动两级列表中的条目。这不同于列表视图,允许两个层次,类似于QQ的好友分组。要实现这个效果的整体思路为:

1.要给ExpandableListView 设置适配器,那么必须先设置数据源。

2.数据源,就是此处的适配器类,此方法继承了BaseExpandableListAdapter,它是ExpandableListView的一个子类。需要重写里面的多个方法。方法的意思,代码中都有详细的注释。数据源中,用到了自定义的View布局,此时根据自己的需求,来设置组和子项的布局样式。getChildView()和getGroupView()方法设置自定义布局。

3.数据源设置好,直接给ExpandableListView.setAdapter()即可实现此收缩功能。

下面是我自己简单做的一个显示效果:

 

layout中主视图expandable_layout.xml(ExpandableListView布局):

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

Layout中group_layout.xml(分组组名展示布局):

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

Layout中child_layout.xml(子菜单item布局):

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

Layout中alertdialog_layout.xml(AlertDialog自定义显示布局):

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  

Activity中Java实现代码(ExpandableListViewDemo.java):

import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
 * Created by panchengjia on 2016/12/2.
 */
public class ExpandableListViewDemo extends AppCompatActivity {
  ExpandableListView el;
  //定义分组名以及对应的图片数组,需一一对应
  String[] country={"魏国","蜀国","吴国"};
  int[] icon={R.mipmap.wei,R.mipmap.shu,R.mipmap.wu};
  //使用二维定义组内成员以及对应头像,同样需要以一一对应
  String[][] heros={{"司马懿","郭嘉","夏侯惇","甄姬"},{"刘备","赵云","张飞"},{"孙权","周瑜"}};
  int[][] icOns={{R.mipmap.simayi,R.mipmap.guojia,R.mipmap.xiahoudun,R.mipmap.zhenji},
      {R.mipmap.liubei,R.mipmap.zhaoyun,R.mipmap.zhangfei},{R.mipmap.sunquan,R.mipmap.zhouyu}};
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.expandable_layout);
    el= (ExpandableListView) findViewById(R.id.el);
    //设置点击下拉子菜单的监听事件
    el.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
      @Override
      public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
        //获取分组成员的姓名
        TextView tv = (TextView) v.findViewById(R.id.tv_item);
        String name = tv.getText().toString();
        //调用show方法(自定义AlertDialog)
        show(v,name);
        return false;
      }
    });
    el.setAdapter(new MyAdapter());//设置自定义适配器
  }
  //定义show方法调出AlertDialog(不再赘述,详情请看前期相关博文,文章末尾有链接)
  public void show(View v,String name){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(name);//设置标题名为传入的字符串(分组内点击对应的人物名)
    View msg = getLayoutInflater().inflate(R.layout.altertdialog_layout,null);
    builder.setView(msg);
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(ExpandableListViewDemo.this, "已发送", Toast.LENGTH_SHORT).show();
      }
    });
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(ExpandableListViewDemo.this, "不想说了", Toast.LENGTH_SHORT).show();
      }
    });
    builder.show();
  }
  //设置自定义适配器
  class MyAdapter extends BaseExpandableListAdapter{
    //获取国家个数
    @Override
    public int getGroupCount() {
      return country.length;
    }
    //获取每个国家对应的人数
    @Override
    public int getChildrenCount(int groupPosition) {
      return heros[groupPosition].length;
    }
    //获取对应国家名
    @Override
    public Object getGroup(int groupPosition) {
      return country[groupPosition];
    }
    //获取对应国家对应的任务
    @Override
    public Object getChild(int groupPosition, int childPosition) {
      return heros[groupPosition][childPosition];
    }
    //获取选择的国家对应数组下标
    @Override
    public long getGroupId(int groupPosition) {
      return groupPosition;
    }
    //获取选择的任务对应数组下标
    @Override
    public long getChildId(int groupPosition, int childPosition) {
      return childPosition;
    }
    //表示人物和国家ID是否稳定的更改底层数据
    @Override
    public boolean hasStableIds() {
      return true;
    }
    //获取一个视图显示国家名以及对应的图标(ListView适配器优化)
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
      ViewHolder vh;
      if(cOnvertView==null){
        cOnvertView=getLayoutInflater().inflate(R.layout.group_layout,null);
        vh=new ViewHolder();
        vh.tv= (TextView) convertView.findViewById(R.id.tv_group);
        vh.iv= (ImageView) convertView.findViewById(R.id.iv_group);
        convertView.setTag(vh);
      }
      vh= (ViewHolder) convertView.getTag();
      vh.tv.setText(country[groupPosition]);
      vh.iv.setImageResource(icon[groupPosition]);
      return convertView;
    }
    //获取一个视图显示国家对应人物以及对应的图标(ListView适配器优化)
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
      ViewHolder vh;
      if(cOnvertView==null){
        cOnvertView=getLayoutInflater().inflate(R.layout.child_layout,null);
        vh=new ViewHolder();
        vh.tv= (TextView) convertView.findViewById(R.id.tv_item);
        vh.iv= (ImageView) convertView.findViewById(R.id.iv_item);
        convertView.setTag(vh);
      }
      vh= (ViewHolder) convertView.getTag();
      vh.tv.setText(heros[groupPosition][childPosition]);
      vh.iv.setImageResource(icons[groupPosition][childPosition]);
      return convertView;
    }
    class ViewHolder{
      ImageView iv;
      TextView tv;
    }
    //设置子选项(对应人物)是可选的
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
      return true;
    }
  }
}

补充说明:

java实现代码中用到自定义适配器ListView的优化,优化步骤如下:

(1)使用固定宽高(match_parent)的ListView,有助于在填充item(ListView中每行的布局)时避免重复渲染ListView组件,导致重复多次调用getView方法。

(2)Convertview用来重复使用已被隐藏的item对象,从而避免重复创建每个item的view对象。

(3)使用ViewHolder优化提高容器中查找组件的效率。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细探讨了Java中StringBuffer类在不同情况下的扩容规则,包括空参构造、带初始字符串和指定初始容量的构造方法。通过实例代码和理论分析,帮助读者更好地理解StringBuffer的内部工作原理。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
author-avatar
楼外蔷薇花开
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有