Android使用notifyDataSetChanged刷新适配器数据无效_萧瑟de虾米的博客-程序员宅基地

技术标签: 安卓  适配器  刷新数据  

今天在写一个显示wifi信号强度的页面时候,发现在刷新数据的时候,无论如何都无法刷新。
在网上找了一些答案后才发现了问题所在。


    srlist = wifiAdmin.getAllNetWorkList();
    wifiadapter = new WifiSignalAdapter(srlist,app);
    wifiList.setAdapter(wifiadapter);

我在上面是通过一个wifiAdmin的工具类的getAllNetWorkLis()方法获取所有的wifi信息列表,
然后 我在线程中写的是
`

 while( !isStop){
                if(wifiAdmin.isOpenWifi()){
                    //创建一个更新UI的线程来更新ui
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //打开wifi后  获取当前的wifi信号列表并且搭载数据
                            srlist = wifiAdmin.getAllNetWorkList();
                            wifiadapter.notifyDataSetChanged();

                        }
                    });
                }else{
                    //目前未打开wifi
                    wifiList.setAdapter(null);
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

`
然后, 我发现无论线程怎么跑 就是无法刷新listview的数据。
百度了很久之后,发现一片博客上面写的是
对于一个listview,当我们把信息存放到一个List链表中时,然后又对这个链表进行流排序,最后去刷新适配器发现无改变,原因为咱们改变流链表中值得位置,但没有改变值在内存中所储存的地址,即引用没有改变,所以我们可以对adapter再new 一次,然后setAdapter 到相应的ListVeiw或者GridView即可解决问题。

看到这里 我才恍然大悟,明白了错的原因在于我每次都是使用 srlist = wifiAdmin.getAllNetWorkList(); 按照上面的说法就是 咱们改变流链表中值得位置,但没有改变值在内存中所储存的地址,即引用没有改变,也就是说,这个srlist被new过一次后 再次去new这个srlist的变量,适配器指向的还是以前的那个srlist地址而不是新new出来的srlist地址

那么,我们能不能不改变存储地址的情况下解决这个问题呢?
我接下来是这么改的

“`
while( !isStop){
if(wifiAdmin.isOpenWifi()){
//创建一个更新UI的线程来更新ui
runOnUiThread(new Runnable() {
@Override
public void run() {
//打开wifi后 获取当前的wifi信号列表并且搭载数据
List newlist = wifiAdmin.getAllNetWorkList();
srlist.clear();
srlist.addAll(newlist);

                            wifiadapter.notifyDataSetChanged();

                        }
                    });
                }else{
                    //目前未打开wifi
                    wifiList.setAdapter(null);
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

现在,再运行一遍,发现有用了。
这种方法其实就是一种“曲线救国”的解法…..还有一种思路是
适配器里面写个刷新数据方法,然后在里面替换新数据后调notifydatachange
或者其他的,解决问题的方法很多,但是总的来说就像我同学说的那样
“黑猫白猫能抓老鼠就是好猫”

顺带感谢论坛里面的其他前辈大佬

参考博客 https://blog.csdn.net/yangyong915/article/details/41593069

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34877234/article/details/81409808

智能推荐

几种常见的响应式导航设计模式优劣分析-程序员宅基地

大屏幕上有两个典型的区域适合放置导航:顶部和左侧,但在缺少屏幕空间的手机屏幕上却是一个有趣的挑战。随着响应式设计越来越流行,在小尺寸屏幕上处理导航的各种方法越来越值得我们关注。而手机网站导航必须在快速获取一个网站的信息和不可见性之间取得平衡。下面是一些处理响应式导航比较流行的技巧,由于下述几种导航方式还没有约定俗成的叫法,所以大家可以结合案例网站来理解他的实际用法: 顶部导航 ..._响应式导航

element-ui实现表格拖动排序_elementui表格拖动排序-程序员宅基地

<template> <div class="app-container"> <!-- Note that row-key is necessary to get a correct row order. --> <el-table ref="dragTable" v-loading="listLoading" :data="list" row-key="id" border fit highlight-current-row style="wi_elementui表格拖动排序

笔记 黑马程序员C++教程从0到1入门编程——提高编程03_《黑马程序员》c++提高编程(三)-程序员宅基地

4 STL-函数对象237 函数对象谓词238 一元谓词239 二元谓词内建函数对象240 算术仿函数241 关系仿函数242 逻辑仿函数5 STL-常用算法_《黑马程序员》c++提高编程(三)

iOS开发实用技术_Touch ID-程序员宅基地

TouchID 开发基础知识支持系统和机型:最低机型iPhone 5s,最低系统iOS8.0依赖框架: #import 注意事项:做iOS8.0以下版本适配时,需要进行API验证备注: 模拟器->Hardware->Touch ID Enrolled代码演示Simulator Screen Shot 2016年5月2日 下午8.55.17.pngView

CryEngine3教程合辑-程序员宅基地

转载自http://tieba.baidu.com/p/3663800102 作者:Tytaa 中文名称: CryEngine游戏关卡设计训练视频教程第一季 外文名称: 3DMotive Introduction To Level Design In CryEngine Volume 1 资源分类: 3DMotive CryEngine教程 游戏关卡设计 视频教程 文件大小: 2.9...

随便推点

当你在浏览器地址栏输入一个URL后回车,将发生的过程:_当我们在游览器地址栏输入-程序员宅基地

域名解析发起TCP的3次握手建立TCP连接后发起HTTP请求服务器响应HTTP请求,浏览器得到HTML代码浏览器解析HTML代码,并请求HTML代码中的资源(如:js、css、图片)浏览器对页面进行渲染呈现给用户;一、域名解析【浏览器查找域名的IP地址】导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下: - 浏览器缓存(浏览器会缓存DNS记录一段时间)。不同的浏..._当我们在游览器地址栏输入

linux停止jar运行命令,Linux编辑启动、停止与重启springboot jar包脚本实例-程序员宅基地

这篇文章主要给大家介绍了关于Linux编辑启动、停止与重启springboot jar包脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧前言springboot的配置文件中,配置文件的名字都有各自的意义跟用途dev 开发环境prod 生产环境(默认)test 测试环境加载指定配置文件 --spring.profiles.a..._linux编写stop jar脚本

Spring通过自定义注解灵活配置AOP切点-程序员宅基地

Spring其中一个核心 AOP(Aspect Oriented Programming)面向切面编程,通过切面注入的方式对目标方法增强。 ..._切点方法增加注解

bootstraptable 合并行数据并居中对齐-程序员宅基地

渲染表格后进行数据行合并,垂直居中对齐

Java 保留两位小数,每三位一个逗号-程序员宅基地

double d = 0.12d;DecimalFormat df= new DecimalFormat('###,###,###,##0.00');df.format(d);

桌面虚拟化中VDI和IDV的五大区别_idv和vdi的区别-程序员宅基地

1、设计理念不同:VDI桌面虚拟化的设计理念是集中计算集中管控,即把所有数据集中在一台或者多台服务器上一个IT人员可同时管控几百上千台的虚拟云桌面,发布桌面等复杂的工作全部由服务器去完成,我们可在服务器管理平台上管控终端用的外设接口、访问权限等以及在管理端就可解决终端用户的桌面问题;IDV桌面虚拟化的设计理念则是分布式计算集中管理,即虚拟桌面充分利用云终端的硬件资源,每个云终端都是虚拟桌面节..._idv和vdi的区别

推荐文章

热门文章

相关标签