`

为什么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工具

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

    BindView.jar

    解压后再bin目录下找到BindView.bat (xml路径)就可以生成代码

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

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

    自定义注解bindview.zip

    自定义注解bindview 省去findviewbyid,直接在变量前边添加@BindView即可绑定控件

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

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

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

    下面小编就为大家分享一篇Android自定义processor实现bindView功能的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Android插件

    针对上面的两种情况,如果view比较少还好说,如果有几十个view,那么我们一个个的手动删除注解,写findviewbyid语句,简直是一场噩梦(别问我为什么知道这是噩梦) 所以,这种有规律又重复简单的工作为什么不能用一...

    Android 自动生成添加控件

    Android 自动生成添加控件 包含了控件换行显示,滑动居中,自动添加等

    Android实现简单实用的搜索框

    本文实例为大家分享了Android实现搜索框展示的具体代码,供大家参考,具体内容如下 展示效果 代码区 SouActivity public class SouActivity extends AppCompatActivity implements TextWatcher{ @BindView(R.id....

    Android中CursorAdapter的使用

    使用CursorAdapter写了一个小的应用

    Android部分自定义框架

    Android自定义框架 包含: BindView注解式绑定控件 JCSlidingMenu侧滑界面控件 JCViewPager左右滑动切换屏幕控件 RoundImageView圆形ImageView JCScrollView有弹性的ScrollView等。 详情请参考源码

    Android代码-ButterKnifeLite

    Android View initializer and Click Listener boiler plate code remover This library is based on the ideas of removing boilerplate code like ButterKnife but with use cases targeted for view binding of ...

    Android 更新RecyclerView的好方法

    一般在使用RecyclerView的时候不免要修改RecyclerView的数据,使用notifyDataSetChanged()来刷新界面,但是当数据比较多,而只是修改了一点的数据,或者刷新比较频繁,这样就会导致界面的卡顿问题,用户交互特别不好...

    butterknife:将Android视图和回调绑定到字段和方法

    Android视图的字段和方法绑定,它使用注释处理为您生成样板代码。 通过在字段上使用@BindView消除findViewById调用。 将一个列表或数组中的多个视图分组。 使用动作,设置器或属性一次对所有这些进行操作。 通过...

    Android代码-kotterknife

    val firstName: TextView by bindView(R.id.first_name) val lastName: TextView by bindView(R.id.last_name) // Optional binding. val details: TextView? by bindOptionalView(R.id.details) // List ...

    Android代码-MyApp

    MainActivity中使用 private void showButtomSelectDialog() { final BottomDialog mDialog = BottomDialog.create(getSupportFragmentManager()); mDialog.setViewListener(new BottomDialog.ViewListener() { ...

    RainbowMVP:轻巧的Android MVP库,易于实现

    bindView(V view)-您需要调用此方法以将视图附加到演示者。 unbindView()-当视图不可用时,您需要调用此方法。 onDestoy()-演示者销毁时调用。 重要的是:你可以在onStart()在活动后,只有你的看法绑定...

    Android代码-RecyclerParallax

    Android Recycler View with Parallax Effect on each item How to use This in an example app, not a library so in order to implement it please take a look at these files: ParallaxAdapter.java -> on the ...

    Android 用Time和Calendar获取系统当前时间源码分享(年月日时分秒周几)

    概述 用Time和Calendar获取系统当前时间(年月日时分秒周几) 效果图 源码: import android.app.Activity; import android.os.Bundle; import android.text.format....import butterknife.BindView; import butterk

Global site tag (gtag.js) - Google Analytics