`

为什么Android的Adapter中,bindview被调用了多次

阅读更多

      在设计某个Activity时,界面使用了ListView,其相应的Adapter中,实现了方法newView()和bindView()。

      在测试时发现,放置在方法bindiew()中的Log输出,在每个ListView item的生成时,均被调用了两次,这与设计的意图是不符合的。

      通过Google,首先找到了下面这个帖子:

      android中CursorAdapter的bindview调用

      提问者huaping100的问题描述与我遇到的是非常相似,下面是其问题描述的部分内容:

      由于自己写了一个CustomAdapter来继承CursorAdapter,要重写bindView和newView方法。
当一个ListActivity的启动时,onCreate方法中会setListAdapter为CustomAdapter。
当我打Log的时候发现每一个Item中bindView方法被调用了两次。也就是说,如果你有3个Item在List中,bindView就被调用了6次。
我想问一下CursorAdapter的bindView方法在什么时候被调用,为什么一个Item要调用两次bindView来显示?


      本贴中的讨论,对提问者huaping100的问题没有给出有效的解决方法,但让我对Android中的Adapter的使用,主要是关于方法getiew(),newView()和bindView(),有更多了解的基础。


      本贴中,回答者ReV_Fycd,提供了一个web链接:

      GetView Vs. BindView in a custom CursorAdapter?

      回答者CommonsWare对提问者的回答中,简明给出了getiew(),newView()和bindView()的关系,同时提到了两个有用的关键点。一个是:the row recycling pattern,这是和ListView的工作机制有关;一个是:the ViewHolder pattern,这是Adapter实现中的一种有效率的方式。


      因为感觉要解决遇到的问题,需要先对ListView和Adapter的工作基础有更多的理解,因此Google了和“the row recycling pattern“有关的东西,找到了下面的blog:

      [Android] ListView中getView的原理+如何在ListView中放置多个item

      此blog的内容是对下面web的翻译:

      HowTo: ListView, Adapter, getView and different list items’ layouts in one ListView

      文中,给出了对row recycling pattern的说明,同时在示例代码中也演示了ViewHolder pattern的设计实现。


      到此,了解了许多东西,虽然遇到的问题没有得到有效的解决,但是确定了一点,即问题的产生,来自对方法getView()的调用。依照这个想法,Google了关键词:Adapter,getView,多次执行。

      找到了下面的blog:

      自定义adapter 的getView方法被重复执行了n次的解决方法

      此blog中转载另一个web,下面只是给出转载的部分内容,其中说明了我遇到的问题,其产生的原因。

     

2、
此问题在于,ListView没有取到实际的高度,无法确定取多少View来填充ListView,也就是运行getView()的具体运行次数。 
3、 应该把listiview在布局文件中的高度设置为:fill_parent

      虽然,文中描述问题的现象与我遇到的有些差异,但是两次和多次只不过是表象。据此,对我的代码进行了修改和测试,问题得到解决。
分享到:
评论
2 楼 xwv 2012-04-21  
能对你有启发和帮助就好
1 楼 lipei.98 2012-04-19  
哈哈 谢谢你的博客,解决了我一个头痛的问题。

相关推荐

    BindView.jar

    `BindView.jar`是一个工具,主要用于简化Android开发中的视图绑定过程。在Android应用程序开发中,通常我们会使用`findViewById`方法来查找并交互UI组件。然而,这个过程可能会变得繁琐,尤其是在大型项目中,因为...

    android 使用之adapter大全

    这篇文章将深入探讨Android中的三种主要Adapter:BaseAdapter、SimpleAdapter和CursorAdapter的使用方法和应用场景。 首先,我们来看BaseAdapter,它是所有自定义Adapter的基类。BaseAdapter允许开发者将任何类型的...

    BindView工具

    在Android代码中bindView的工作是进行自动生成。虽然大家都喜欢使用注解的方法,但是我这个是简易的生成,纯String的分析

    编译注解实现bindView/contentView框架的Demo

    在Android开发中,我们经常需要将布局文件中的控件与Java代码中的成员变量进行绑定,以便于操作这些控件。传统的做法是通过`findViewById()`方法来查找并赋值,但这种方式繁琐且容易出错。为了解决这个问题,开发者...

    自定义注解bindview.zip

    在Android开发中,我们经常需要在Activity或Fragment中查找并绑定UI控件,这通常通过调用`findViewById()`方法来实现。然而,这样的操作既繁琐又容易出错,特别是当项目中的视图元素较多时。为了解决这个问题,...

    RecyclerViewAdapter with Butterknife

    Butterknife是一款注解处理库,简化了Android中的视图注入,减少了手动查找和设置视图元素的繁琐工作。 本文将深入探讨如何结合Butterknife为RecyclerView创建一个通用的适配器,使代码更加简洁、易于维护。我们将...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    接下来,我们需要为这两个ListView分别创建Adapter,并在代码中设置它们。对于父ListView的Adapter,你需要提供一个包含子ListView数据的列表。当调用getView()方法时,根据数据创建或复用一个View,并在这个View中...

    Android中CursorAdapter的使用

    本篇文章将深入探讨如何在Android应用程序中有效地使用CursorAdapter,以及涉及的核心方法newView()和bindView()。 首先,CursorAdapter是BaseAdapter的一个子类,它的主要作用是将Cursor对象中的数据绑定到...

    Android自定义processor实现bindView功能的实例

    在Android开发中,为了提高代码的可读性和可维护性,开发者经常使用各种注解库,如ButterKnife、Retrofit、Dragger和EventBus等。这些库利用注解来简化视图绑定、网络请求、依赖注入等操作。本文将探讨如何通过...

    SQLite适配器使用

    SQLite适配器(Adapter)在Android开发中扮演着重要角色,它们帮助我们把SQLite数据库中的数据转换成用户友好的UI展示,通常在ListView或RecyclerView等视图组件中使用。以下是关于SQLite适配器的详细知识: 1. ...

    分离holder的低耦合度的adapter

    在Android开发中,Adapter是一种非常重要的组件,它用于在ListView、RecyclerView等视图组件中展示数据。本示例“分离holder的低耦合度的adapter”着重探讨如何通过优化Adapter的设计来提高代码的可维护性和复用性。...

    Android-Android中编译时注解实际运行Demo仿照ButterKnife来写的

    在Android中,我们通常使用Java的`@Retention(RetentionPolicy.CLASS)`或`@Retention(RetentionPolicy.SOURCE)`策略来定义编译时注解。 1. **注解处理器**:在仿照ButterKnife的Demo中,关键在于创建一个自定义的...

    Android Studio 插件android-butterknife-zelezny.jar

    这样,你就不需要手动为每个视图创建成员变量和`findViewById()`调用,大大提高了开发效率。同时,由于代码更整洁,也使得项目更易于维护。 总的来说,"android-butterknife-zelezny.jar"插件是Android开发中提高...

    自定义实现的bindview框架(Butterknife)

    自定义实现的bindview框架(Butterknife),通过编译时注解处理(APT)+JavaPoet(生成java代码)+反射(调用bind方法),来在框架中实现了,事件的自动绑定和视图的自动绑定。

    Android 自动生成添加控件

    在Android中,我们可以使用各种布局管理器,如LinearLayout、RelativeLayout、GridLayout和ConstraintLayout等,来组织和定位控件。但当控件数量过多时,手动管理这些布局可能会变得非常繁琐。自动添加控件的机制...

    AOP的apt之android中的实际应用demo

    **Android中的AOP(面向切面编程)与APT(注解处理工具)** 在Android开发中,AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它允许开发者将关注点分离,比如日志记录、权限检查等,从主业务...

    Android程序源码--适配器

    在Android中,常见的适配器有BaseAdapter、ArrayAdapter、CursorAdapter和RecyclerView.Adapter等。 **BaseAdapter基础** BaseAdapter是最基础的适配器类,适用于自定义数据结构。你需要重写其中的几个关键方法,如...

    实战演练-Android应用市场

    ListView控件在Android中的核心作用在于展示数据集,它可以动态加载数据,从而节省内存,提高性能。在实际应用中,我们通常会结合Adapter来使用ListView,Adapter是连接数据源和ListView的桥梁,它负责将数据转化为...

    android sqlite多线程和异步加载数据库数据示例

    在这个示例中,我们将探讨如何在Android中进行多线程数据库操作以及如何利用CursorAdapter实现异步加载数据库数据。 首先,我们来看多线程访问SQLite数据库。在Android中,主线程负责UI的更新和交互,而长时间运行...

Global site tag (gtag.js) - Google Analytics