Android使用notifyDataSetChanged刷新适配器数据无效
今天在写一个显示wifi信号强度的页面时候,发现在刷新数据的时候,无论如何都无法刷新。
在网上找了一些答案后才发现了问题所在。
srlist = wifiAdmin.getAllNetWorkList();wifiadapter = new WifiSignalAdapter(srlist,app);wifiList.setAdapter(wifiadapter);
我在上面是通过一个wifiAdmin的工具类的getAllNetWorkLis()方法获取所有的wifi信息列表,
然后 我在线程中写的是
`
while( !isStop){if(wifiAdmin.isOpenWifi()){//创建一个更新UI的线程来更新uirunOnUiThread(new Runnable() {@Overridepublic void run() {//打开wifi后 获取当前的wifi信号列表并且搭载数据srlist = wifiAdmin.getAllNetWorkList();wifiadapter.notifyDataSetChanged();}});}else{//目前未打开wifiwifiList.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{//目前未打开wifiwifiList.setAdapter(null);}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
现在,再运行一遍,发现有用了。
这种方法其实就是一种“曲线救国”的解法…..还有一种思路是
适配器里面写个刷新数据方法,然后在里面替换新数据后调notifydatachange
或者其他的,解决问题的方法很多,但是总的来说就像我同学说的那样
“黑猫白猫能抓老鼠就是好猫”
顺带感谢论坛里面的其他前辈大佬
参考博客 https://blog.csdn.net/yangyong915/article/details/41593069
Android使用notifyDataSetChanged刷新适配器数据无效相关推荐
- Android 设置定时刷新页面数据,最小自动刷新时间
设置初始时间 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String t ...
- android回退页面刷新页面数据
1.onResume()方法 activity或fragment页面中(简称原页面)启动新的页面(简称新页面),新页面返回时需要原页面刷新数据,观察他们的生命周期可以看出,启动新的页面,原页面会依次调 ...
- Android 下拉刷新用法
导入PullToRefresh 1.1 修改library的build.gradle中的sdk版本 //修改前 compileSdkVersion 16 buildToolsVersion " ...
- 如何让listview或者gridview设置到底刷新新数据
昨天简单的看了一下ScrollView的例子,虽然可以实现拉到底触发监听,但是Listview和gridview本身就自带了下拉属性,所以不需要ScrollView来实现. 那么在Listview和g ...
- android notifydatasetchanged 刷新错误,Android 调用notifyDataSetChanged方法失败解决办法
Android 调用notifyDataSetChanged方法失败解决办法 如果使用ListView.GridView等进行数据展示,当绑定的数据有了更新的时候,需要实时刷新ListView,即调用 ...
- android notifydatasetchanged 刷新错误,android – notifyDataSetChanged()不刷新可扩展列表视图...
我正在使用Expandable ListView,其中的数据通过Sqlite数据库填充.我已经选择从ExpandableListView中删除一个组,它实际上删除了数据库中的相应行.但是活动不会刷新, ...
- android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题
今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...
- win8.1 android驱动安装失败,win8.1驱动安装失败提示“数据无效”如何解决
最近一些用户在win8.1系统中安装驱动失败,并且提示"数据无效",也不知道哪里出现问题,尝试多遍还是一样,其实驱动安装失败的原因有很多,大家只需简单两步就能解决无法安装驱动问题, ...
- android addview 闪屏,android - 在notifyDatasetChanged()之后,RecyclerView闪烁
android - 在notifyDatasetChanged()之后,RecyclerView闪烁 我有一个RecyclerView,它从API加载一些数据,包括一个图像URL和一些数据,我使用ne ...
最新文章
- [ZJOI2018]历史
- ISA2004发布应用程序服务器
- Error:java: 无效的目标发行版: 11解决方案
- 最大值_285期 博最大值2路,已经箭在弦上!
- java sessionid放入cookie_JAVA开发 SESSION和COOKIE的关系
- C#后台调用前台js(RegisterStartupScript)
- c++ 将引用赋值给引用_5分钟掌握 Python 对象的引用
- 微信公众帐号开发教程第7篇-文本消息中换行符的使用
- PHP与Spring的强势接口设计_微课介绍
- vue组件化的基本使用
- 一次搞定各种数据库 SQL 执行计划:MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite
- 方舟建筑代码指令大全
- [笔记]Windows核心编程《十七》内存映射文件
- JavaScript 计数器
- 计算机填充表格,表格自动填充 这几种你也会?
- C语言程序代码 25 编程实现将任意一个华氏法表示的温度,转换为以摄氏法表示的温度。
- 网络爬虫——中国大学排名数据抓取
- 2022年湖南省社会工作者考试综合实务(初级)练习题及答案
- STL教程:C++ STL快速入门
- CNN | 06Cifar-10分类