Override ListView getAdapter造成的后果

pgpool-II踩坑日记两则 最近结合pgpool-II进行postgreSQL高可用的部署,过程非常煎熬,作为新手,公司也没有前辈熟悉postgreSQL,只能自己摸索。好在已经搞明白了,把困扰我很长时间的两个问题分享一下。 1. show pool_nodes 第一个问题就是 show pool_nodes 的使用,照着教程建好后,在哪里执行这个指令呢?我在pg服务器上怎么执行这个指令都显示 ERROR: unrecognized configuration parameter "pool_nodes",一度怀疑人生。翻阅了很多资料 阅读详情

最近工作中,发现了一个bug,是和ListView Adapter有关的。产生了FC,描述信息大约是

"The content of the adapter has changed but ListView did not receive a notification. Make sure the content of  your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(xxx) with Adapter(HeaderViewListAdapter)]"

它的大意是,Adapter内的数据发生了变化,但是UI却没有更新,您是否忘记调用了notifyDataSetChanged?


这实际上是一个非常有误导的信息。一般情况下,我们不会忘记调用该函数的。但是如果我们不小心,从listview继承一个新的类,并override它的getAdapter方法,就可能会出问题了。


ListView是支持HeaderView和footerView的,即在listview的最初和最末尾的位置添加一些特殊的view。它的实现方法,就是通过一个HeaderViewListAdapter。


HeaderViewListAdapter会包装一个Adapter,这个是由用户自己设置的。ListView中对应的代码是

    @Override
    public void setAdapter(ListAdapter adapter) {
        if (mAdapter != null && mDataSetObserver != null) {
            mAdapter.unregisterDataSetObserver(mDataSetObserver);
        }

        resetList();
        mRecycler.clear();

        if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
            mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
        } else {
            mAdapter = adapter;
        }

ListView的getAdapter返回的是mAdapter,即可能是一个HeaderViewListAdapter.


如果override getAdapter,并返回HeaderViewListAdapter内部包装的Adapter,就会出问题。也就是上面提到的FC.


这种问题是怎么出现呢?

首先,这个异常抛出的位置,是在函数layoutChildren中,抛出的条件是mItemCount != mAdapter.getCount(),代码如下:

else if (mItemCount != mAdapter.getCount()) {
                throw new IllegalStateException("The content of the adapter has changed but "
                        + "ListView did not receive a notification. Make sure the content of "
                        + "your adapter is not modified from a background thread, but only from "
                        + "the UI thread. Make sure your adapter calls notifyDataSetChanged() "
                        + "when its content changes. [in ListView(" + getId() + ", " + getClass()
                        + ") with Adapter(" + mAdapter.getClass() + ")]");
            }

那么mItemCount的值是在哪里赋值呢?mItemCount不是ListView的成员,而是ListView的超超类:AdapterView的成员,这个值也是在DataObserver.onChanged中设置的,您可参考AdapterView的源码:

class AdapterDataSetObserver extends DataSetObserver {

        private Parcelable mInstanceState = null;

        @Override
        public void onChanged() {
            mDataChanged = true;
            mOldItemCount = mItemCount;
            mItemCount = getAdapter().getCount(); //这里!注意用法getAdapter()

            // Detect the case where a cursor that was previously invalidated has
            // been repopulated with new data.
            if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
                    && mOldItemCount == 0 && mItemCount > 0) {
                AdapterView.this.onRestoreInstanceState(mInstanceState);
                mInstanceState = null;
            } else {
                rememberSyncState();
            }
            checkFocus();
            requestLayout();
        }

如果 getAdapter() != mAdapter就会发生问题:getAdatper返回的是mAdapter(即HeaderListViewAdapter),那么,mAdapter.getCount() == getAdapter().getCount() + header view count + footer view count.

出现上面的问题就在所难免了。



set_output_delay的本质 阅读详情

相关推荐

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

getAdapter理解

先看官方的doc说明: Object org.eclipse.core.runtime.IAdaptable.getAdapter(Class adapter) Returns an object which is an instance of the given class associated with this object. Returns null if no such ob...

weixin_34344677的博客 831

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4871

《每日一剂》适配器刷新报错adapter.notifyDataSetChanged()解决

开发十年,就只剩下这套Java开发体系了 >>>    ...

qq_40567164的博客 840

华强北手表256G真相大揭秘:ADB命令实测内存与存储(附完整调试教程)

本文通过ADB命令实战揭秘华强北智能手表256G存储等硬件参数的真实性。文章提供了从开启调试模式到使用ADB命令查询系统属性、验证内存与存储容量的完整教程,帮助用户识别参数虚标,评估设备真实性能与潜在风险。

e3f4g5的博客 1232

C51编程25-应用篇(单片机与电脑端实现wifi通讯)

单片机使用ESP-01S wifi模块与电脑端进行数据通讯。

qq_34343637的博客 1万+

Android适配器更改,ListView未收到通知解析

The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

夨坕的博客 637

视觉惯性SLAM系列——ORB-SLAM3的整体介绍及各个线程的功能(五)

跟踪线程(Tracking Thread)作用:负责处理每一帧图像,进行相机位姿的估计和定位。它首先执行与前一帧图像的特征匹配,然后通过仅运动(motion-only)BA(Bundle Adjustment)优化位姿。如果跟踪失败,它会尝试在所有地图中进行重定位。此外,跟踪线程还负责决定何时插入新的关键帧,以及何时将关键帧从局部地图中移除。详细介绍见局部建图线程(Local Mapping Thread)作用:管理局部地图,向活跃地图添加关键帧和点,移除多余的关键帧和点。

曾经也曾立志 1004

android中listview的setAdapter()和getAdapter()

在android中经常使用到listview或者其他AbsListView,以下用listview加以说明。 对于其listview的内存回收,需要使用如下方式: 在activity的onstart生命状态中执行重建操作: listview.addHeaderView(View); listview.addFooterView(View); listv

李光正的专栏 1万+

智能工厂评估模型研究

摘要:通过对国内外现有智能制造评估模型的研究,结合重庆制造业行业领跑者与落后者之间差距大的现状,以实现全要素全连接的数字化工厂为出发点,融合工业互联网标识,构建实践可行的智能工厂评估模型推动中小型企业参与智能制造转型,缓和两极分化问题。本评估模型包含工厂体系架构的3个层级,提供用于推动智能制造转型的参考,包括设计、生产、管理的全过程评估。关键词:智能制造评估模型;智能制造转型;全连接工厂;工业互联网标识0 引言受行业需求与技术创新的影响,全球制造业在历经了工业1.0机械化、工业2.0电气化和工业3.0自动

罗伯特技术屋 677

开源Harness项目DeerFlow 2.0,让智能体几乎能完成任何复杂任务

从提示工程到上下文工程,再到如今的 Harness,这条演进路径的本质是从“教模型如何理解人类”迈向“为模型构建一个可执行、可信赖、可长期运转的数字世界”。 当越来越多像 DeerFlow 2.0 这样的 Super Agent Harness 走向普及,AI 将真正进化为能理解、会规划、可执行、敢交付、长期负责的成熟生产力形态。

技术引领业务创新 519

Android 开发中踩过的坑之十三: ListView中的getAdapter

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33831673的博客 409

【APM】在Kubernetes中,使用Helm安装Grafana 9.5.1

Grafana是一款流行的开源数据可视化和分析平台,它特别擅长处理时序数据,即随时间变化的数据,因此在监控系统性能、应用程序指标、物联网(IoT)设备数据等领域有着广泛的应用。

CN_Eden 1200

ListView高效刷新——刷新单条数据

在使用ListView时,需要刷新数据的时候,我们通常的做法是调用mAdapter.notifyDataSetChanged()刷新界面,毫无疑问这很简单,现在咱们测试一下其效率,并对其进行优化。

guchuanhang的专栏 6796

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

GetAdaptersInfo()和GetAdaptersAddresses()获取网卡信息

GetAdaptersInfo()和GetAdaptersAddresses()获取网卡信息

lingsnoopy的博客 2802

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android13 BluetoothManager getAdapter流程分析

【代码】Android13 BluetoothManager getAdapter流程分析。

liuning1985622的博客 510

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Adapter的作用及用法

首先,我们常用的Adapter有四种,分别是BaseAdapter、SimpleAdapter、ArrayAdapter、SimpleCursorAdapter四种。              BaseAdapter:基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承自接口类Adapter,由于是基础类型,所以自由度高, 可以修改的地方多。

结尾自在人心 1万+

android中Adapter适配器的讲解

Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看。Adapter有很多的接口、抽象类、子类可以使用,这里就我们常用的几个进行讲解 BaseAdapter,ArrayAdapter,SimpleAdapter,为了配合讲解这几个适配器,这里提前使用一下List...

weixin_30609287的博客 869

安卓基础学习——ListView与Adapter的使用

一、ListView的理解   ListView是用来显示可滑动列表的ViewGroup,其实用与其他的使用步骤不同,需要动态地添加显示的内容。使用ListView显示列表的步骤如下; 指出ListView的显示位置,可以放在一个线性布局中; 给出每一个item的布局文件,用来设置item的显示结构(也就是ListView中每一项的具体形式); 准备数据; 准备数据适配器 设置数据适配器   其中准备数据和数据适配器是学习ListView的重点。由于ListView中的每一个item是依次展示的,因此,

weixin_45123763的博客 1164

浅析listview及Adapter原理一

ListView作为常用的列表控件,通常会定义不同适配器以承载其所绑定数据的特殊显示。常用的适配器(ArrayAdapter, BaseAdapter等)也都用过,但是大家有没有考虑过为什么要用适配器? 问题一:适配器是承载数据的,如何跟listview建立联系?     疑问我们需要了解适配器Adapter基础接口:registerDataSetObserver  (注册数据监听

u011098381的专栏 868

Listview的Adapter的转换

原文:http://blog.sina.com.cn/s/blog_6d45d11f01014n1c.html 如果ListView没有headerView或者footerView的时候,与listView相关联的Adapter就是传进来的参数Adapter,如果有,就将原来的Adapter包装成HeaderViewListAdapter,看看HeaderViewListAdapter的文档说明

雪梦科技 1459

ListView.getCount() 与 ListView.getChildCount()

    ListView.getCount()(实际上是 AdapterView.getCount()) 返回的是其 Adapter.getCount() 返回的值。也就是“所包含的 Item 总个数”。    ListView.getChildCount()(ViewGroup.getChildCount) 返回的是显示层面上的“所包含的子 View 个数”。     二者有什么不同

farproc's blog 2万+

Android开发教程--关于Adapter的The content of the adapter has changed问题分析

我们在做android list开发的时候,有时候会遇到类似这样的问题: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not

David.Wang 做你喜欢的事情 3930

[Android] ListView中getView的原理+如何在ListView中放置多个item

<br />ListView 和 Adapter 的基础<br />工作原理:ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。 一个新的视图被返回并显示 <br />如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!<br />实际上Android为你缓存了视图。<br />Android中有个叫做Recycler的构件,下图是他的工作原理:<br />如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在

yidan923的专栏 1169

关于Listview的一个没有notifyDataSetChanged导致的错误

log为:java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread,

shangguan 1924
上一篇: PopupWindow的一些使用总结
下一篇: 在PreferenceAcitity中使用Fragement时避免额外的Left和RightPadding
漂流的代码
博客等级 码龄23年 188粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值