一般情况下,使用adapte的具体步骤如下:
1,new对象
2,添加adapter
3,然后请求数据,
4,设置数据。
5,通知adapter数据发生改变,进行刷新。

如果有再次请求,则是:
1,先请求数据,
2,删除原来的数据,
3,添加请求到的数据,
4,对数据进行刷新。

刚遇到的一个错误,
使用的流程是就是:
1,删除数据,
2,请求数据,
3,然后添加数据,
4,刷新数据

代码如下:

public static void request() {list.clear();String url = "http://192.168.1.103:8080/sxpitransportation/intersection/findIntersectionByIid.do";for (int i = 0; i < 5; i++) {http_lv.get(url + "?iid=" + (i + 1), new Http_lv.Onreqeut() {@Overridepublic void on(String s) {Log.e(""+Thread.currentThread().getName(), "on: "+s );try {JSONObject object = new JSONObject(s);String string = object.optString("msg");object = new JSONObject(string);A11_Baen baen = new A11_Baen(object.optInt("iid"),object.optInt("red"), object.optInt("green"),object.optInt("yellow"));list.add(baen);if (list.size() == 5) {adapter.notifyDataSetChanged();}} catch (JSONException e) {e.printStackTrace();}}});}
}

就是先清空数据源,然后请求到数据后对adapter的数据源进行添加数据,然后刷新adapter
报的错误如下所示:

 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, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131165215, class android.widget.ListView) with Adapter(class com.laohu.cn.A11$5)]at android.widget.ListView.layoutChildren(ListView.java:1618)

翻译如下:

适配器的内容已经更改,但ListView没有收到通知。
确保适配器的内容不是从后台线程修改的,
而是只从UI线程修改的。确保适配器在其内容更改时调用notifyDataSetChanged()。

原因应该就是在请求数据之前清空了数据,然后才进行网络请求,在请求的过程中,listview发现数据源已经发生变化,但是并没有通知说数据源发生了变化,所以才导致了这个异常。

修改如下:

public static void request() {String url = "http://192.168.1.103:8080/sxpitransportation/intersection/findIntersectionByIid.do";for (int i = 0; i < 5; i++) {http_lv.get(url + "?iid=" + (i + 1), new Http_lv.Onreqeut() {@Overridepublic void on(String s) {Log.e(""+Thread.currentThread().getName(), "on: "+s );try {JSONObject object = new JSONObject(s);String string = object.optString("msg");object = new JSONObject(string);A11_Baen baen = new A11_Baen(object.optInt("iid"),object.optInt("red"), object.optInt("green"),object.optInt("yellow"));temp.add(baen);if (temp.size() == 5) {list.clear();list.addAll(temp);temp.clear();adapter.notifyDataSetChanged();}} catch (JSONException e) {e.printStackTrace();}}});}
}

创建一个全局变临时集合temp存储请到的数据。首先请求到数据后,第一步就是清掉数据源,然后添加请求到的数据到数据源,然后清空temp,最后刷新适配器就好了。

还有一种做法就是,数据源发生变化之后立即对适配器进行刷新。代码如下:

public static void request() {list.clear();adapter.notifyDataSetChanged();String url = "http://192.168.1.103:8080/sxpitransportation/intersection/findIntersectionByIid.do";for (int i = 0; i < 5; i++) {http_lv.get(url + "?iid=" + (i + 1), new Http_lv.Onreqeut() {@Overridepublic void on(String s) {Log.e(""+Thread.currentThread().getName(), "on: "+s );try {JSONObject object = new JSONObject(s);String string = object.optString("msg");object = new JSONObject(string);A11_Baen baen = new A11_Baen(object.optInt("iid"),object.optInt("red"), object.optInt("green"),object.optInt("yellow"));list.add(baen);if (list.size() == 5) {/* list.clear();list.addAll(temp);temp.clear();*/adapter.notifyDataSetChanged();}} catch (JSONException e) {e.printStackTrace();}}});}
}

我在刚开始清除了数据源,然后立即进行刷新,最后在进行网络请求,拿到数据后给数据源,在刷新一次。这样也可以。

总结一下:无非就是在数据源发生变化的时候必须立即对adapter进行刷新。而我上面就是数据源发生变化了,但是并没有对其进行刷新,跟着请求了数据,然后才刷新。在这个过程中刷新是在网络请求结束后操作的,所以会有一定的耗时,结果I就导致了异常。我上面写了两种解决的办法,第一种是请求到数据之后才清空数据源,对其进行刷新。这样好处就是如果网络请求失败,并不会更改数据源。
但是第二种就是直接清空,在刷新,在网络请求。这样就导致网络请求失败后数据源被清空了,界面上就没有要显示的东西了。

如有错误,还请指出,谢谢!

刷新adapte要注意的地方,和adapter使用的流程相关推荐

  1. java程序回滚之后在哪看_Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?...

    代码流程 前台点击"提交订单"进入BaseServlet.class BaseServlet.class分发至子类OrderServlet.class的submitOrder()方 ...

  2. recyclervie刷新到底部_RecyclerView底部刷新实现详解

    关于RecyclerView底部刷新实现的文章其实已经很多了,但大都只介绍了其基本原理和框架,对其中的很多细节没有交代,无法直接使用.本文会着重介绍RecyclerView底部刷新实现的一些细节处理. ...

  3. RecyclerView局部刷新和原理介绍

    RecyclerView局部刷新和原理介绍 一.引言 二.局部刷新的正确使用姿势 三.局部刷新的原理 3.0 前提 3.1 RecyclerView与Adapter建立观察者模式 3.2 onItem ...

  4. RecyclerView底部刷新实现详解

    关于RecyclerView底部刷新实现的文章已经很多了,但大都只介绍了其基本原理和框架,对其中的很多细节没有交代,无法直接使用.本文会着重介绍RecyclerView底部刷新实现的一些细节处理. 1 ...

  5. 关于Adapter对数据库的查询、删除操作

    先来看清空号码操作(第一个选项是清空所有.下面的是popupwindow动态填充电话号码.为清空单个号码通话记录) /** 查询到单个号码的Sipaccount*/if (mContactDailDe ...

  6. Adapter的notifyDataSetChange无效的问题

    前段时间遇到一个问题,那就是在Activity中通过构造函数实例化自定义Adapter并setAdapter()后,再修改数据源,赋值后调用notifyDataSetChange()方法,然并卵的问题 ...

  7. Vscode+Latex 添加引用文献及自动刷新

    文章目录 前言 插入引用文献 文献自动刷新 逐渐放弃word,但是也无法全部丢弃,因为word下还是有许多有用的插件,如英文写作利器,Grammarly,有了它至少不用犯许多低级错误.但是word的排 ...

  8. 关于实现token无感刷新的解决方案

    问题引入 在开发中为了安全或满足分布式场景,通常会舍弃原有的session认证手段,而采用jwt(json web token):但是使用token难免遇到token有效期的问题,如果token长期有 ...

  9. linux kernel 2.6 i2c设备驱动程序框架介绍,linux设备驱动程序-i2c(2)-adapter和设备树的解析...

    linux设备驱动程序-i2c(2)-adapter和设备树的解析 (注: 基于beagle bone green开发板,linux4.14内核版本) 而在linux设备驱动程序--串行通信驱动框架分 ...

最新文章

  1. What is Wiki?
  2. SpringBoot(2.4.0)自动配置原理(源码)
  3. TensorFlow 笔记4--使用tensorboard
  4. 实验14:访问CMOS RAM显示当前日期和时间
  5. jboss mysql驱动目录_找不到mysql.jdbc.Driver – MySQL,JBoss
  6. 【Java】对Java构造器参数问题的若干思考
  7. Jenkins远程命令执行漏洞(CVE-2018-1000861复现)
  8. python实现秒杀商品的微信自动提醒功能(附代码)
  9. STL 源代码剖析 算法 stl_algo.h -- search
  10. 金蝶K3退出远程桌面后,客户端无法登陆
  11. Hyperledger Fabric on SAP Cloud Platform
  12. 简单理解t检验与秩和检验
  13. 使用微信企业号发送工资条教程
  14. 病房管理系统c语言设计,病房呼叫系统设计与仿真
  15. h5调用指纹识别_H5 画布指纹识别
  16. MIMIC-iv官方SQL查询标注(简单基础篇)
  17. 会话机制(session)
  18. HTML5期末大作业:旅游网站设计——蓝色的地方旅游门户(9页) HTML+CSS+JavaScript
  19. 相对路径和绝对路径 cd命令 创建和删除目录 rm命令
  20. MPI编程----计算cosx的积分

热门文章

  1. Python函数(函数定义、函数调用)用法详解
  2. WWDC22 多媒体特性汇总
  3. 计算机软件著作权转让协议
  4. 100个问题搞定Java虚拟机
  5. 证券公司信息化8-什么是银行间债券市场?定息收益部主要做什么的?债券是跨市场品种吗?
  6. 如何释放已使用的EOS RAM,然后就可以自由买卖了
  7. 字节跳动开源其云原生数据仓库 ByConity
  8. DW1000芯片 室内定位传感器
  9. BloodHound官方使用指南
  10. HTML5,图片边框,.9效果处理