Android 解决 adapter.notifyDataSetChanged() 不起作用

recyclerView adapter.notifyDataSetChanged()分析 ① mAdapter.notifyDataSetChanged(); 跟进源码,发现是通过观察者模式进行分发的 RecyclerView.Adapter: public final void notifyDataSetChanged() { this.mObservable.notifyChanged(); } ② 找到注册观察者的地方:应该就是设置设... 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/like_program/article/details/52517119

使用 Listview 的时候,给 adapter 的数据源 List 添加了新的数据,然后调用 adapter.notifyDataSetChanged(),发现 listview 并没有显示出新增的数据,但是遍历输出 List 中的元素,发现新增数据已经被添加到 List 中了,数据既然已经被添加到数据源中了,为什么 Listview 没有更新呢?

上网,查书,查了半天,终于在《Android群英传》中找到答案:

使用 adapter.notifyDataSetChanged() 时,必须保证传进 Adapter 的数据 List 是同一个 List
而不能是其他对象,否则无法更新 listview。

即,你可以调用 List 的 add(), remove(), clear(),addAll() 等方法,这种情况下,List 指向的始终是你最开始 new 出来的 ArrayList ,然后调用 adapter.notifyDataSetChanged() 方法,可以更新 ListView;但是如果你重新 new 了一个 ArrayList(重新申请了堆内存),那么这时候,List 就指向了另外一个 ArrayLIst,这时调用 adapter.notifyDataSetChanged() 方法,就无法刷新 listview 了。

说了这么多,不如来写个小 Demo 来感受下:

打开 Android Studio,新建一个 ListViewTest 项目。

activity_main.xml 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.listviewtest.MainActivity">

    <Button
        android:id="@+id/btn_add_success"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加数据成功"/>

    <Button
        android:id="@+id/btn_add_fail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加数据失败"/>

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除数据"/>

    <Button
        android:id="@+id/btn_clear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="清空数据"/>

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
</LinearLayout>

布局文件很简单,从上至下,依次是 3 个按钮和一个 ListView。

MainActivity.java 代码如下:

package com.example.listviewtest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static final String TAG = "MainActivity";

    /**
     * 添加成功 按钮
     */
    private Button btnAddSuccess;

    /**
     * 添加失败 按钮
     */
    private Button btnAddFail;

    /**
     * 删除数据 按钮
     */
    private Button btnDelete;

    /**
     * 清空数据 按钮
     */
    private Button btnClear;

    private ListView listView;

    /**
     * 适配器的数据源
     */
    private List<Integer> dataList;

    /**
     * 适配器
     */
    private ArrayAdapter adapter;

    /**
     * 添加的数据
     */
    private int addNumber = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 实例化控件
        btnAddSuccess = (Button) findViewById(R.id.btn_add_success);
        btnAddFail = (Button) findViewById(R.id.btn_add_fail);
        btnDelete = (Button) findViewById(R.id.btn_delete);
        btnClear = (Button) findViewById(R.id.btn_clear);
        listView = (ListView) findViewById(R.id.listview);

        // 设置点击监听
        btnAddSuccess.setOnClickListener(this);
        btnAddFail.setOnClickListener(this);
        btnDelete.setOnClickListener(this);
        btnClear.setOnClickListener(this);

        // 初始化数据
        initData();

        // 创建适配器
        adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout
                .simple_list_item_1, dataList);
        // 设置适配器
        listView.setAdapter(adapter);
    }

    /**
     * 初始化数据源
     */
    private void initData() {
        dataList = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            dataList.add(i);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // 如果点击的是 添加数据成功 按钮
            case R.id.btn_add_success:
                // 添加数据 成功
                dataList.add(addNumber);
                adapter.notifyDataSetChanged();
                Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
                Log.d(TAG, "数据源:" + dataList.toString());
                break;
            // 如果点击的是 添加数据失败 按钮
            case R.id.btn_add_fail:
                dataList = new ArrayList<>();
                initData();
                // 添加数据失败
                dataList.add(addNumber);
                adapter.notifyDataSetChanged();
                Toast.makeText(MainActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
                Log.d(TAG, "数据源:" + dataList.toString());
                break;
            // 如果点击的是 删除数据 按钮
            case R.id.btn_delete:
                if (!dataList.isEmpty()) {
                    // 删除 list 最后一个数据
                    int deleteNumber = dataList.get(dataList.size() - 1);
                    dataList.remove(deleteNumber);
                    adapter.notifyDataSetChanged();
                    Toast.makeText(MainActivity.this, "删除数据", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "数据源:" + dataList.toString());
                } else {
                    Toast.makeText(MainActivity.this, "已经没有数据了", Toast.LENGTH_SHORT).show();
                    Log.d(TAG, "数据源:" + dataList.toString());
                }
                break;
            // 如果点击的是 清空数据 按钮
            case R.id.btn_clear:
                // 清空数据
                dataList.clear();
                adapter.notifyDataSetChanged();
                Toast.makeText(MainActivity.this, "清空数据", Toast.LENGTH_SHORT).show();
                Log.d(TAG, "数据源:" + dataList.toString());
                break;
        }
    }
}

MainActivity.java 代码也很简单,给四个按钮加上了按键监听,然后让 ListView 显示了 3 个数字,接下来,我们先点击 添加数据成功,删除数据,清除数据 ,这 3 个按钮,看 adapter.notifyDataSetChanged() 能否正常工作。

success

查看动态图,我们可以看到,点击这 3 个按钮,adapter.notifyDataSetChanged() 都可以正常工作,因为数据源始终是同一个 List,修改的只是 List 中的数据。

我们重新启动下 ListViewTest,再来看看点击 添加数据失败 按钮,adapter.notifyDataSetChanged() 能否正常工作。

查看 Logcat ,我们发现,数据源中的数据已经更新了:

logcat

fail

但是查看动态图,我们可以看到,点击按钮,ListView 并没有更新数据,这时因为重新 new 了一个 ArrayList(重新申请了堆内存),那么这时候,List 就指向了另外一个 ArrayLIst,而要更新 ListView,必须保证传进 Adapter 的数据 List 是同一个 List 而不能是其他对象,所以 ListView 就无法更新了。

源码下载

自定义adapter 改变数据后调用notifyDataSetChanged() 不起作用的解决方法 1.问题描述:         ListView填充的数据改变时需要及时刷新页面,正常来讲我们只需要调用 adapter.notifyDataSetChanged();  方法就可以了,系统使用观察者模式去通知修改相关liseView的页面值。但是今天发现一个问题 无论我什么调notifyDataSetChanged() 页面就是不改变。。。。 这可愁死了 2.解决方法:   后来 阅读详情

相关推荐

展锐双摄帧同步实战:从配置到调试的完整避坑指南

本文深入剖析了在展锐平台上实现双摄帧同步的完整流程与核心技术。详细对比了硬件帧同步与软件帧同步的差异、应用场景及核心挑战,提供了从XML配置、驱动层适配到调试验证的实战指南。重点强调了硬件帧同步必须与固定帧率强绑定这一关键避坑点,并分享了针对景深虚化等场景的同步质量验证方法及长稳测试策略。

kiwi8的博客 401

notifyDataSetInvalidated , notifyDataSetChanged

notifyDataSetInvalidated(),会重绘控件(还原到初始状态) notifyDataSetChanged(),重绘当前可见区域 public void notifyDataSetChanged ():该方法内部实现了在每个观察者上面调用onChanged事件。每当发现数据集有改变的情况,或者读取到数据的新状态时,就会调用此方法。   public void noti

2527

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 417

适配器adapter中notifyDataSetChanged()不起作用的其他总结

修改:数据源cxDataMaps 需要有add或者其他方法来使其发生改变。一个个Map数据直接添加到cxDataMaps 中就可以了。原因分析:代码认为cxDataMaps 这个数据源没有发生改变,所以adapter中不重新加载。问题现象:调用notifyDataSetChanged()方法时不起作用。

jxj960417的博客 638

Linux 之 supervisor安装和使用

运行Supervisor的后台服务,它用来启动和管理那些你需要Supervisor管理的子进程,响应客户端发来的请求,重启意外退出的子进程,将子进程的stdout和stderr写入日志,响应事件等。它是Supervisor最核心的部分。

chang995196962的博客 5545

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 908

adapter.notifyDataSetChanged()无效处理方法。

最近在帮朋友做一个文件管理系统,基于android的,这里就记录一下一些趟过的坑。 1.adapter.notifyDataSetChanged(); 为什么无效呢。 主要是因为它观察的那个对象,被我不小心换了。比如我先是 list绑定在这个adapter上,然后我从数据查完 list =data 这样赋值过来,顺手就notify。那就拉闸了,list指向的地址变了,也就不对了。解决方法。list...

qq_39197781的博客 1731

【OpenClaw从入门到精通】第23篇:OpenClaw办公自动化实战—报表生成+文档批量处理+跨系统同步(2026实操进阶版)

本文聚焦OpenClaw在办公自动化场景的进阶应用,针对职场中高频且重复的报表生成、文档批量处理、跨系统数据同步三大痛点,提供从环境搭建、原理讲解到完整代码实现的全流程实操指南。方案基于Python生态工具链(pandas、Playwright、PyPDF2等)与OpenClaw的低代码编排能力,兼顾新手入门与进阶提升——新手可直接复用代码快速落地,进阶读者可学习流程编排逻辑进行二次开发。所有案例均基于真实办公场景设计,部分虚拟场景已明确标注,代码经本地环境验证可复现。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 965

adapter.notifyDataSetChanged()失效解决方案

谈起这个方法我相信基本每个接触一点Android开发的都用到过,但是好多时候并不是我们使用错了,而是无意之间的写法导致我们.notifyDataSetChanged()突然失去了效果,让我们摸不着头脑,下面根据自己的使用经验总结三种解决方法。1.数据源没有更新,调用notifyDataSetChanged无效。针对这个我们可以打断点看数据源发送变化没来解决。2.adapter初始化时绑定的数据集合的

tijjyire的博客 2284

【AI智能体】Codex AI 辅助编程高级技能实战操作详解

Codex AI 辅助编程高级技能实战操作详解

congge 6755

`tokenizer.decode` 出现乱码或异常输出,怎么处理

摘要: 在使用Hugging Face Transformers库时,tokenizer.decode出现乱码或异常输出的解决方案包括:1)确保模型与分词器严格匹配,加载时使用trust_remote_code=True;2)谨慎处理特殊token,先保留所有token再针对性清理;3)校验模型输出token的维度和数值是否合法;4)通过convert_tokens_to_string替代解码;5)检查生成配置如max_new_tokens等参数。核心思路是确保模型与分词器逻辑对齐、输出token合法,必要

ZhangJiqun&191cm&85kg 583

Android中关于notifyDataSetChanged()方法的注意

1、首先介绍下notifyDataSetChanged()方法的原理 notifyDataSetChanged方法原理 2、介绍下我在此处犯的错误 public class HomeFragment extends BaseFragment implements HomeContract.View{ List<BookBean> allBooks; //TypeBookAdapte...

weixin_38420342的博客 2万+

delphi fmx android 自动更新(一)

所以,如果是http 则,manifest.xml application 下,https无需添加。增加android:usesCleartextTraffic="true",不然无法使用http下载东西。1,REQUEST_INSTALL_PACKAGES 权限。4,WRITE_EXTERNAL_STORAGE 权限。3,READ_EXTERNAL_STORAGE 权限。一般是从http下载安装包 apk。2,INTERNET 权限。sFile为apk包路径。

全粘工程师 550

关于Adapter的notifyDataSetChanged()方法数据不更新问题解析

概述做安卓开发的同学应该大多都经历过adapter中在调用了notifyDataSetChanged()方法之后数据不更新的问题,作为菜鸟的我也同样踩过坑,现在写这篇文章作为总结。正文话不多说,上代码!首先是Activity的布局,两个按钮,代表两种加载数据的方式,然后一个ListView。<LinearLayout xmlns:android="http://schemas.android

u010618194的博客 3088

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ViewPager adapter.notifyDataSetChanged()刷新问题

在自定义adapter继承PagerAdapter的时候,一般只会实现instantiateItem()、destroyItem()、isViewFromObject()、getCount()这几个方法,这样在数据源不变的情况下,ViewPager展现是没有问题的,但是当数据变化了,ViewPager需要增加或减少item的时候,通常会调用adapter的notifyDataSetChanged(...

丿天邪的博客 2099

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RecyclerView调用notifyDataSetChanged()不起作用

背景 上周,之前的一个朋友发消息给我,RecyclerView的notifyDataSetChanged()方法没有用。心里一想,自己之前不就是这么用的么。但是好像脑海里有看到过也有人遇到了类似的问题,所以还是把迷雾拨开吧。探索 自己一直有一个习惯,遇到问题不会先谷歌,会先点到源码里面看一下,再查官方文档,再谷歌。点进notifyDataSetChanged源码里面看了一下,就一行代码,但是能看到...

qijingwang的博客 6417

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

为什么我的adapter.notifyDataSetChanged()不起作用?

1.一开始这样的: case R.id.scann_button: //发送扫描生成音乐列表广播 Intent broadcast_scann = new Intent();   broadcast_scann.setAction(Constant.DB_SCANNMUSIC);               sendBroadcast(broadcast_scann);        

di4zhibiao的博客 1113

android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;

问题? android使用notifyDataSetChanged()方法,发现adapter的数据更新了,但是ListView的内容没有更新? 查阅如下网站解决方案都没有解决: http://blog.csdn.net/williamz1980/article/details/5837998 http://15975604853.blog.163.com/blog

Sunnyfans的专栏 5万+

adapter.notifyDatasetChanged

<br />package com.testadapter; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import

pipisky2006的专栏 7735

Android 之 adapter.notifyDataSetChanged() 无响应

今天开发Android遇到一个问题,就是adapter.notifyDataSetChanged() 后,列表并无变化。第一开始的代码片段是这样的:(简化后的,大家知道意思即可) listItem = new ArrayList(); //listItem 为存储List中每个item的值的...

chuanjiaoxie1663的博客 314

android listview 删除item 刷新 notifyDataSetChanged()失效问题

问题:在item点击删除后,调用了adapter.notifyDataSetChanged();刷新,

LiLi_ko的专栏 7545

Android学习笔记--adapter.notifyDataSetChanged()延迟执行

adapter.notifyDataSetChanged(); 在Android开发中该方法会经常使用到。最近项目中发现一个问题。 即 adapter.notifyDataSetChanged() 方法是有延迟的。 举个例子: public class MainActivity extends AppCompatActivity {     private

PigWithBadGuy的专栏 2454

Android问题集-RecyclerView---adapter.notifyDataSetChanged()不起作用

今天在使用RecyclerView过程中adapter.notifyDataSetChanged()不起作用,通过Logcat打印发现数据源变化了,但是视图一直没变,后面发现是list集合在内存中的地址变了。 Gson gson=new Gson(); String jsonData= JsonUtil.getResult(response,"xmlJson");//从response中获取

飞翔的小乌龟的博客 6912

adapter.notifyDataSetChanged()不起作用的解决

adapter.notifyDataSetChanged()不起作用的解决 eg: private CommuFriendValidateAdapter validateAdapter = null; private List&lt;FriendValidateListItem&gt; friendList = null; friendList = new ArrayList&lt;Fri...

牛八少爷的专栏 1248

论Android Adapter notifyDataSetChanged 与notifyDataSetInvalidated无效原因

最近在开发中遇到一个问题,Adapter中使用notifyDataSetChanged 与notifyDataSetInvalidated无效,经过思考和网上查找,得出如下原因。 首先看一下notifyDataSetChanged与notifyDataSetInvalidated的区别 我们可应用粮仓来解释一下,两者的区别。 notifyDataSetChanged:粮仓中得粮食少了,或者多

aygxylxk的专栏 2866
上一篇: Java 把 Date 转换为 String 类型
下一篇: Android 解决 adb server is out of date. killing... 错误
like_program
博客等级 码龄10年 88粉丝 18原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值