您描述的行为是CursorAdapter的工作方式。
CursorAdapter有内置的视图回收:
newView()
如果需要视图对象的新实例,则调用它。
bindView()
然后在此之后调用,bindView()
接收和先前返回的视图newView()
(不一定以相同的顺序)。bindView 的工作是根据来自光标的数据将视图设置为适当的状态。
现在,当您滚动时,一些视图会被推出可见区域,而新视图会被拖入可见区域。新视图需要根据游标中的数据进行实例化和状态设置。这可以通过重复步骤 1 和 2 来完成。
然而,随着视图回收,被推出可见区域的视图被扔到“回收视图池”中,CursorAdapter将尝试重新使用这些视图并将其交给bindView()
,从而跳过第 1 步(并节省资源)。
那么为什么newView()
在设置适配器时调用呢?
仅仅因为回收视图池是空的,还没有视图被滚动出可见区域,因此 Cursor Adapter 只能调用newView()
获取一个新的视图实例,然后将其传递给bindView()
.
把它们加起来:
newView()
:创建视图实例(通常使用布局充气器)
bindView()
:根据您的光标数据(例如文本、图像、按钮等)设置作为参数接收的视图的状态
希望这能消除一些困惑。