`
lynen
  • 浏览: 129998 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

ListView的adapter中的getView函数多次重复调用,导致数据显示重复的问题分析

 
阅读更多

使用ListView显示数据,其中单个item的xml文件中存在ImageView,且此ImageView的图像内容是从网络上下载下来的。实现的时候,为提供ListView的显示性能,因此在adapter的getView中复用了convertView对象。

功能实现后,测试过程中发现如下问题:

在listview显示的数据项存在翻页的情况下,有的时候滚动完成会出现图片显示错乱或者是相邻两个item的图片显示的是同一张的问题。

 

问题排查的思路:

1.最开始定位的是ImageView在加载网络图片的时候,有可能会在图片显示对象convertView中的ImageView对象出现线程时序的问题导致的重复。反复验证发现,问题并非出自网络图片的加载机制。此疑点放过。

 

2.使用比较吐的方法,将getView中的position的值打印出来,查看打印的结果发现:

即使未显示adapter中的第0个元素的情况下,也会出现有大量的日志是第0个元素调用getView的情况。

未解决重复的问题,首先要排除掉第0个元素调用了多次getView的情况。

自行定义了一下问题,一时查看代码也发现不了问题原因在哪里,谷歌一把发现:此文章有提到getView被多次调用的情况:http://my.eoe.cn/fover23/archive/4885.html

 

按照此文章的问题解决思路,将listview中的在layout文件中的layout_height="wrap_content",修改成 layout_height="match_parent"或者是"fill_parent",解决了第0个元素多次调用getView的问题。

在解决此问题的基础上在测试图片显示重复的问题:发现图片显示重复的问题也没有了。

 

回滚代码,再次验证重复图片本应该显示的位置,发现出现重复图片的情况是因为应该显示a,b项的图片结果确显示了第0项的图片。

 

问题启示:android在绘制view的过程中的长宽衡量方法与过程应该要更精确的掌握。

分享到:
评论

相关推荐

    android listview getview多调用俩周期

    然而,有时开发者会遇到`getView()`被多次调用的情况,这可能会导致性能问题或者预期效果无法实现。下面我们将深入探讨`getView()`的调用机制、多调用周期的原因以及如何优化。 1. **`getView()`的调用机制** `...

    ListView中使用自定义Adapter及时更新数据

    本篇将详细讲解如何在ListView中使用自定义Adapter来实现数据的及时更新。 首先,我们需要理解ListView的工作原理。ListView通过Adapter来与数据源进行交互,Adapter是连接数据集和视图的桥梁。它负责从数据集中...

    listview 自定义adapter的例子demo

    在Adapter的构造函数中,传入这个数据源。 4. 将自定义的Adapter关联到ListView。在Activity或Fragment中,找到ListView的引用,然后调用`setAdapter()`方法,传入自定义的Adapter实例。 5. 最后,如果数据源发生...

    UDP数据的接收,并且在Listview中显示出来

    将分割后的数据添加到数据列表中,再调用`adapter.notifyDataSetChanged()`更新ListView。 注意,为了实现循环接收和显示数据,你需要在一个循环或异步线程(如Java的`Thread`或Android的`AsyncTask`)中不断调用`...

    视频案例-3.ListView动态添加数据

    5. 动态添加数据:当需要向ListView添加新数据时,只需在数据源中添加新的数据对象,然后调用Adapter的`notifyDataSetChanged()`方法,通知ListView数据已更新,ListView会自动刷新显示。 在实现动态加载数据时,还...

    自定义的ListView结合RadioButton显示对话框列表数据

    在Android开发中,自定义的ListView结合RadioButton显示对话框列表数据是一种常见的用户界面设计,用于在弹出的对话框中展示一系列可选的列表项。这样的设计能够为用户提供清晰的选择方式,同时保持屏幕的整洁。以下...

    android读取sqlite数据库的数据并用listview显示

    当数据库中的数据发生变化时,只需刷新Adapter即可更新ListView的显示。这个示例对于理解Android中SQLite与ListView的交互非常有帮助,可以作为开发类似功能的基础模板。记得在实际项目中处理异常,优化数据库操作,...

    将SQLite数据展示到listview小案例

    本案例将详细介绍如何将SQLite数据库中的数据展示到ListView上,这是一个基础且实用的功能,对于任何需要显示大量结构化数据的应用都至关重要。 首先,我们需要创建一个SQLite工具类,这个类通常命名为`SQLite...

    android listview 自反射 adapter

    Adapter是连接ListView和数据源的桥梁,它将数据转化为ListView可以显示的View。通常,开发者会创建一个继承自BaseAdapter的自定义Adapter,重写其中的方法,如`getCount()`、`getItem()`、`getItemId()`以及`...

    安卓listview相关相关-listview实现表格效果表格线带假数据.rar

    4. 更新ListView:在Activity或Fragment中,通过调用ListView的`setAdapter()`方法,将自定义Adapter传递给ListView,从而显示数据。 四、注意事项 1. 性能优化:由于ListView的复用机制,需要确保`getView()`方法...

    采用listview实现数据列表显示

    在Android开发中,ListView是一种非常常见且重要的组件,它用于展示大量数据的列表形式,比如联系人列表、应用列表等。本教程将详细介绍如何利用ListView来实现数据列表的显示,并重点探讨其中涉及到的三种适配器。 ...

    ListView +RatingBar +TextView +adapter

    在Adapter的构造函数中,传入数据列表和上下文,并初始化必要的变量。 接下来,我们重写Adapter的几个关键方法: 1. `getCount()`: 返回ListView中项的数量,即数据列表的长度。 2. `getItem(int position)`: 根据...

    安卓使用listview和intent数据传送

    ListView是一个可以滚动的视图,它可以显示一列或多列数据项。在Android中,ListView通过动态加载数据,节省内存,特别适合处理大量数据。使用ListView时,我们需要创建一个Adapter实例,将数据源绑定到ListView上...

    listview上拉加载chackbox复用

    5. **上拉加载更多**:当涉及到上拉加载更多功能时,确保在加载新数据后,正确更新Adapter的数据集,并调用`notifyDataSetChanged()`通知ListView数据已改变。这样,ListView会自动处理新数据的视图复用和显示。 ...

    Android ListView 自定义adapter好友列表

    4. 在Activity或Fragment中设置Adapter:将数据集和自定义Adapter传入ListView,并设置Adapter。 ```java List<Friend> friends = ...; // 初始化好友列表 FriendListAdapter adapter = new FriendListAdapter(this...

    listview的事件处理

    本篇文章将深入探讨ListView的事件处理,特别是如何处理ListView与Button共存时焦点问题,以及在Adapter中实现接口来响应按钮点击,改变ListView中的数据。 首先,我们来解决“listview与button共存抢夺焦点问题”...

    android修改listview列表的item中某个控件的值demo

    在这个特定的示例中,我们探讨的是如何在不调用Adapter的`notifyDataSetChanged()`方法的情况下,直接修改ListView列表项中某个具体控件(如TextView)的值。这种方式在某些场景下可能会提高性能,因为`...

    android自定义接口,然后在activity中实现点击监听,调用getView解决滑动错位的问题

    Adapter是连接数据源(如ArrayList)和视图(如ListView或RecyclerView)的桥梁,它负责将数据转化为可显示的视图项。在默认情况下,Adapter并不直接处理触摸事件,而是将这些事件传递给底层的View。这就可能导致在...

    listview添加按钮

    点击事件的处理函数可以根据需求添加新数据到数据源,然后调用Adapter的notifyDataSetChanged()方法更新ListView。 在实现过程中,需要注意性能优化,因为ListView的复用机制可能导致按钮状态在滚动时出错。例如,...

    android JSON解析放入ListView

    - 设置ListView:将适配器设置到ListView上,通过调用`listView.setAdapter(adapter)`完成数据绑定。 2. 示例代码: - 请求数据: ```java OkHttpClient client = new OkHttpClient(); Request request = new ...

Global site tag (gtag.js) - Google Analytics