首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ExpandableList getChildView每个子项运行两次

根据您的问答内容,我将回答以下问题:

ExpandableList getChildView每个子项运行两次

问题概述

在使用ExpandableList时,子项视图(子项布局)可能会被多次创建和重用。getChildView()方法可能会被调用多次,导致性能问题。本问题旨在了解如何优化这个问题,以及如何正确地使用和实现ExpandableList。

问题解答

在使用ExpandableList时,getChildView()方法会被多次调用,这是因为ExpandableList会重用子项视图以提高性能。为了解决这个问题,您可以采取以下措施:

  1. 使用ViewHolder模式

使用ViewHolder模式可以帮助您重用子项视图,从而提高性能。ViewHolder模式是一种常用的优化Android ListView性能的技术,它可以避免频繁地创建和销毁视图对象。

示例代码:

代码语言:java
复制

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

代码语言:txt
复制
   ViewHolder holder;
代码语言:txt
复制
   if (convertView == null) {
代码语言:txt
复制
       convertView = LayoutInflater.from(context).inflate(R.layout.child_item, parent, false);
代码语言:txt
复制
       holder = new ViewHolder();
代码语言:txt
复制
       holder.textView = convertView.findViewById(R.id.text_view);
代码语言:txt
复制
       convertView.setTag(holder);
代码语言:txt
复制
   } else {
代码语言:txt
复制
       holder = (ViewHolder) convertView.getTag();
代码语言:txt
复制
   }
代码语言:txt
复制
   holder.textView.setText(getChild(groupPosition, childPosition).toString());
代码语言:txt
复制
   return convertView;

}

static class ViewHolder {

代码语言:txt
复制
   TextView textView;

}

代码语言:txt
复制
  1. 使用RecyclerView代替ExpandableList

虽然ExpandableList可以满足一些特定场景的需求,但它的性能并不理想。您可以考虑使用RecyclerView代替ExpandableList,因为它具有更好的性能和更丰富的功能。

示例代码:

代码语言:java
复制

// 使用RecyclerView.Adapter实现您的适配器

public class MyExpandableAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

代码语言:txt
复制
   // ...

}

代码语言:txt
复制
  1. 优化数据源

确保您的数据源(例如,数组或列表)已经被正确地初始化和更新。避免在每次调用getChildView()时都进行数据源的更新,这可能会导致性能问题。

推荐的腾讯云相关产品

  • 腾讯云对象存储(COS):一个高性能、低成本、可扩展的云存储服务,适用于存储大量非结构化数据。
  • 腾讯云CDN:一个全球内容分发网络,可以帮助您更快地向用户提供网站、应用程序和流媒体内容。
  • 腾讯云API网关:一个可扩展、高性能的API管理服务,可以帮助您安全、稳定地运行API。

产品介绍链接地址

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

A022-列表容器之ExpandableListView

上面实现的效果可展开的二级列表,每个组项都可能有若干个子项,默认的ExpandableListView不太美观,我们需要通过自定义布局类美化它,在使用过程中有一些需要我们去了解的点,会在实现过程提一下。...getGroupView(获取显示指定组的视图对象) getChildView(获取显示指定项的视图对象) isChildSelectable(子项是否可选中) 传入组项列表(如:List<GroupItem...groupViewHolder.itemDivider.setVisibility(View.VISIBLE); } return convertView; } @Override public View getChildView...maps.put(groupPosition, expandStateAtPosition); } } 解析一下上面的代码,我们可以看到ExpandableListView除了一个组项,每个组项下面有若干个子项...和getChildView方法来设置组视图和子项视图数据,最后返回填充数据的视图对象,一些逻辑控制的代码也是在这两个方法中进行,比如控制组项的展开、组项的点击、子项的点击、子项被选中效果等等,这里笔者是自定义了回调接口来满足业务的需求

91710
  • Appium+python自动化(二十五)- 那些让人抓耳挠腮、揪头发和掉头发的事 - 获取控件ID(超详解)

    方式二: 连接您的真机设备或打开模拟器,运行cmd窗口,进入到sdk/tools目录下,输入命令hierarchyviewer.bat,运行hierarchyviewer。 ?...我们可以看到在上图hierarchy viewer中的每个控件所对应的框形中,右下角都有一个数字。...由上图中,uiautomatorviewer每个控件前面的数字即相当于Hierarchyviewer的角标,我们同样可以获取到目标ID的最终有效且唯一的父节点,从而调用函数getChildView('id...小结 一、直接在sdk>tools下面找到hierarchyviewer.bat双击运行,然后运行成功了。...具体操作启动步骤: 1、运行命令monitor.bat,如下图 ? 2、运行命令后出现,如下图的界面 ? 3、点击“Window->Open Perspective”。如图 ?

    2.1K31

    Android CR 案例集 & 最佳实践

    是代码中未经预先定义而直接出现的数值 (1)尽量避免使用魔法数字,应代之有名字的常量或枚举 (2)原则上代码中直接出现的数值就是魔法数字, 经常被用作下标和初始值的 0 除外 (3)禁止出现相同数值的魔法数字两次...避免空指针异常 // Don't ivAvatar = getChildView("single_feed_iv_avatar")!!....● 扩展性、灵活性:它支持的可选字段意味着不仅能获得很好的前向/后向兼容性(对 于生命周期的游戏来说尤其重要,因为不需要每个新版本都更新所有数据)。...● 强类型设计:尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正。...● 使用简单:生成的 C++ 代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以在运行时,高效解析 Schema 和类 JSON 格式的文本。

    80310

    【JMeter-4】JMeter元件详解之逻辑控制器

    循环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求,总请求数为10*100=1000 。...2.5 Once Only Controller(仅一次控制器) 仅一次控制器,会使该控制器下的子项每个线程只运行一次。...可见,【仅一次控制器】线程间是隔离的,每个线程启动后,会运行一次【仅一次控制器】。 如果,【仅一次控制器】和【循环控制器】结合起来呢?...如果勾选了此项,随机控制器下的子控制器中的多个子项只会被执行一个。 修改脚本结构,线程组【循环次数】为2,运行脚本,结果两次都随机到了【简单控制器1】: ?...2.8 Random Order Controller(随机顺序控制器) 随机顺序控制器,与简单控制器类似,会执行它下面的每个子项,只不过执行顺序是随机的。 ?

    1.5K20

    SpringBoot 打包部署最佳实践

    每个模块都是独立的spring boot程序,整合到一个包的时候会出现多个启动类,多个配置文件冲突的问题。 每个模块有引用相同的依赖,依赖包版本升级后,需要每个pom文件都做修改。...创建一个spring boot的子项目,作为启动项目,我们称为start项目。 其余子项目为普通的java maven项目,parent设置为第一步创建的spring boot父项目。...start项目的pom引用其他子项目的依赖。 本地调试可以直接运行start的启动类,ide会自动编译其他模块并引用。...每一次发布都是一个新的镜像,但这种方式有个问题就是如何保证前一个环境验证没问题,后一个环境就一定没问题,因为两个镜像是不一样的,虽然可能两次构建都是基于同一版本代码,但因为是重新构建,中间可能因为各种原因...,如maven包版本更新等,无法保证两次构建就是完全一样的镜像。

    4.2K20

    SpringBoot打包部署最佳实践

    每个模块都是独立的spring boot程序,整合到一个包的时候会出现多个启动类,多个配置文件冲突的问题。 每个模块有引用相同的依赖,依赖包版本升级后,需要每个pom文件都做修改。...创建一个spring boot的子项目,作为启动项目,我们称为start项目。 其余子项目为普通的java maven项目,parent设置为第一步创建的spring boot父项目。...start项目的pom引用其他子项目的依赖。 本地调试可以直接运行start的启动类,ide会自动编译其他模块并引用。...每一次发布都是一个新的镜像,但这种方式有个问题就是如何保证前一个环境验证没问题,后一个环境就一定没问题,因为两个镜像是不一样的,虽然可能两次构建都是基于同一版本代码,但因为是重新构建,中间可能因为各种原因...,如maven包版本更新等,无法保证两次构建就是完全一样的镜像。

    3.6K30

    漫谈依赖管理工具:从Maven,Gradle到Go

    比如Go语言,如果用C/C++可能需要定义复杂的Makefile来定义编译的规则,以及如何运行测试用例,而在Go中,这些都是约定好的。...运行时依赖?于是依赖多了scope的定义。 如果仅仅是这样把Maven理解成标准化的Ant+ivy+可扩展的插件框架即可?但现实世界的项目往往更复杂。...这个其实和源码管理习惯有关系,是每个独立的module作为单独的源码仓库呢?还是将相关的module全部放在一起?从降低沟通成本的角度考虑,还是应该通过一个大的仓库组织。...于是Maven引入了module的概念,同一个项目下可以有多个module,每个module有单独的pom文件来定义,但为了避免重复,Maven的pom文件支持parent机制,子项目的pom文件继承parent...这个过程中,由于要构建两次,提交两次源码仓库,上传一次jar包,任何一步出错都会导致release失败,所以使用比较复杂。 到此,Maven的核心概念都分析完了,其他的都是插件机制上的一些扩展。

    2.6K70

    Android零散

    使用ExpandableList可以实现展开这样的效果,如果对于列表中的每个可点击的标题View需要更多的定制,而不是简单的展开——例如点击全选等,那么可使用ListView嵌套GridView组合实现...而addFooterView在setAdapter之后执行的话,虽然不引起运行时错误——但是更迷惑的是——添加的视图是看不到了。 这个是和API Level相关的一个问题,算是谷歌的坑吧。...在区间外的viewType值,会引起运行时的indexoutofboundexception错误,这个是ListView自身的限制。...使用startService来启动一个已经运行中的,正在启动中的,重新启动中的Service时,系统会在这些不同的Service状态下对onStartCommand的调用产生一些差异。 //待续。。。

    67160

    Jmeter系列(55)- 详解 Throughput Controller 吞吐量控制器

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 自行调整该控制器下的子项的执行频率...若不勾选(默认),所有线程统一计算执行频率 注意事项 虽然名叫吞吐量控制器,但并不控制控制器,只是控制子项的执行频率(次数) Total Executions 的栗子 线程组结构树 ?...取样器222执行了 8 次,每个线程执行了 4 次 取样器111只执行了 4 次,每个线程执行了 2 次 勾选 per user 的栗子 线程组结构树 ? 线程组属性 ?...取样器222执行了 6 次,每个线程执行了 3 次 取样器111只执行了 4 次,每个线程执行了 2 次 控制器对每个线程单独生效 如果不勾选 Per User,结果树会怎么样呢 ?...每个线程一共会执行 4 次 sampler2 均会执行 4 次 sampler1 均会执行 2 次,且都在线程第一次循环的时候,通过循环控制器循环两次执行的

    1.2K10

    Maven

    子项目直接继承父项目的groupId,子项目会直接继承父项目的所有依赖,除非依赖添加了optional标签 我们还可以让父Maven项目统一管理所有的依赖,包括版本号等,子项目可以选取需要的作为依赖,...,因为现在父项目将所有的依赖进行集中管理,子项目需要什么拿什么即可,同时子项目无需指定版本,所有的版本全部由父项目决定,子项目只需要使用即可: <dependency...Maven常用命令 我们可以看到在IDEA右上角Maven板块中,每个Maven项目都有一个生命周期,实际上这些是Maven的一些插件,每个插件都有各自的功能,比如: clean命令,执行后会清理整个target...工具窗口中,我们可以通过以下 3 种方式中执行 Maven 命令: 1、使用 Run Anything 窗口 在 Maven 工具窗口的工具栏上,点击“m”按钮,或在 IntelliJ IDEA 中连续两次按下...,在该节点下可以看到运行配置列表 在运行配置列表中,双击目标,或右键点击该目标然从上下文菜单中选择 Run,即可运行该目标。

    67530

    js中对数组进行遍历都有哪些方法_js遍历json对象

    filter find findIndex every some reduce reduceRight 其他方法 for for in for of 数组方法 map 核心 创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果...和continue forEach 核心 对数组的每个元素执行一次提供的函数。...核心 对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。...简单说就是看数组的每个元素是否符合要求,都符合则返回true,否则返回false let everyArr = [2,3,4]; let everyResult= everyArr.every((item...return item > 0}); console.log(everyResult);//结果为: true 缺陷 可以使用return,但是不能使用break和continue some 是对数组中每一项运行指定函数

    7.9K20

    使用mono-repo实现跨项目组件共享

    /customer-site lerna bootstrap 上面的图片可以看到,packages/下面的每个子项目有自己的node_modules,如果将它打开,会发现很多重复的依赖包,这会占用我们大量的硬盘空间...:先在每个子项运行npm install,等所有依赖都安装好后,将他们移动到顶层的node_modules。...则会检查每个子项目里面依赖及其版本,如果版本不一样则会留在子项目自己的node_modules里面,只有完全一样的依赖才会提升到顶层。...启动子项目 现在我们建好了三个子项目,要启动CRA子项目,可以去那个目录下运行yarn start,但是频繁切换文件夹实在是太麻烦了。...其实有了lerna的帮助我们可以直接在顶层运行,这需要用到lerna的这个功能: lerna run [script] 比如我们在顶层运行了lerna run start,这相当于去每个子项目下面都去执行

    3.1K41

    速读原著-Gradle 在大型 Java 项目上的应用

    1.3独享配置 在项目中,除了设置共同配置之外, 每个子项目还会有其独有的配置。比如每个子项目具有不同的依赖以及每个子项目特殊的 task 等。...Gradle 提供了两种方式来分别为每个子项目设置独有的配置。 在父项目的 build.gradle 文件中通过 project(‘:sub-project-name’)来设置对应的子项目的配置。...通过这种方式,指定对应的子项目,并对其进行配置。 我们还可以在每个子项目的目录里建立自己的构建脚本。...因为,第二种配置方式将各个项目的配置分别放到单独的 build.gradle 文件中去,可以方便设置和管理每个子项目的配置信息。...在运行脚本的时候,传入的-Pprofile=development 可以指定使用哪个运行环境的配置文件。

    2K10
    领券