-1

您好,我有一个应用程序使用 GridView 使用 CursorAdapter 从媒体存储加载数据。它加载并运行,除了 GridView 似乎通过调用适配器中的 newView 加载媒体存储中的每个项目。

在 logcat 中,调用 newView 后会调用 bindView。当我滚动只调用 bindView 的网格时,它工作正常。

看起来只有当我第一次在 gridView 上应用适配器时,才会为每个项目调用 newView 和 bindView。

这是以前的帖子,但还没有找到任何答案: 链接到以前的帖子

4

1 回答 1

2

您描述的行为是CursorAdapter的工作方式。

CursorAdapter有内置的视图回收:

  1. newView()如果需要视图对象的新实例,则调用它。
  2. bindView()然后在此之后调用,bindView()接收和先前返回的视图newView()(不一定以相同的顺序)。bindView 的工作是根据来自光标的数据将视图设置为适当的状态。

现在,当您滚动时,一些视图会被推出可见区域,而新视图会被拖入可见区域。新视图需要根据游标中的数据进行实例化和状态设置。这可以通过重复步骤 1 和 2 来完成。

然而,随着视图回收,被推出可见区域的视图被扔到“回收视图池”中,CursorAdapter将尝试重新使用这些视图并将其交给bindView(),从而跳过第 1 步(并节省资源)。

那么为什么newView()在设置适配器时调用呢?

仅仅因为回收视图池是空的,还没有视图被滚动出可见区域,因此 Cursor Adapter 只能调用newView()获取一个新的视图实例,然后将其传递给bindView().

把它们加起来:

  • newView():创建视图实例(通常使用布局充气器)
  • bindView():根据您的光标数据(例如文本、图像、按钮等)设置作为参数接收的视图的状态

希望这能消除一些困惑。

于 2013-09-23T06:19:06.437 回答