gpt4 book ai didi

android - CursorAdapter 在每个项目上调用 bindView

转载 作者:行者123 更新时间:2023-11-29 15:33:01 25 4
gpt4 key购买 nike

我在使用 DeskClock 的一些代码时发现,当我尝试修改 CursorAdapter 时,每个项目都会调用 newView。 (我实际上想添加一个分隔线,看起来单独添加分隔线比将它们添加到单个 listView 中更好)

如果我有 3 个项目,我会得到以下行为:

 newView - called with item: 0  bindView - called with item: 0  bindView - called with item: 1  bindView - called with item: 2  bindView - called with item: 0 newView - called with item: 1  bindView - called with item: 1 newView - called with item: 2  bindView - called with item: 2 newView - called with item: 0  bindView - called with item: 0  bindView - called with item: 1  bindView - called with item: 2

我希望每个游标项调用一次 newView/bindView。但是,情况似乎并非如此。这对我来说是个问题,因为我想根据光标数据选择适当的 View ,但由于 bindView 可以在 newView 之前调用,所以这不起作用。

这是某种奇怪的回收行为(还是某种正常/预期的行为)?还是代码有问题(我删除了除 ListView 之外的所有内容,但它仍在执行此操作)?我不太清楚为什么您会尝试绑定(bind)尚未创建的 View ,以及为什么 newView 在第一个项目上被调用两次。

谢谢!

顺便说一句,如果有人有向 ListView 添加分隔符的简单方法,我很想知道。如果没有,我打算尝试深入了解联系人示例,看看他们是如何做到的。


顺便说一句,以防万一有人想知道 MergeAdapter 是否可以随意乱用并尝试(我会在其他一些情况下使用它)。但是,我最终只是编写了一个处理多个 View 的适配器。它计算每个项目的类型(较小的项目),将其存储在映射中,在创建适配器时对其进行初始化,并在 notifyDataSetChanged 中对其进行更新。

然后您只需要让 getViewTypeCount() 返回可能的 View 数。 getItemViewType 从 map 返回类型(基于 0,因此 0-getViewTypeCount())。如果您可以从不需要 map 的位置计算出您的类型,但即时执行此操作是不可能的,所以我只是在需要时预先/重新计算。

最佳答案

我遇到了同样的问题,其中 bindView 被多次调用(确切地说是 3 次)用于我的光标中的每个条目。我找到的解决方法是将我的布局切换为相对布局,如下所示:

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
>
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#666666"
android:layout_weight="1"
android:drawSelectorOnTop="false"
android:layout_alignParentTop="true"
/>
<TextView android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_gradient_2"
android:text="No Evidence Available"
android:padding="10dp"
android:layout_below="@android:id/list"

/>
</RelativeLayout>

以前我一直在使用 LinearLayout,但无法让它工作。使用 LinearLayout 每行调用一次 bindView 的唯一方法是在 ListView 上设置固定高度。由于几乎所有 LinearLayout 都可以使用 RelativeLayout 重新创建,因此您应该能够切换两者,然后告诉 ui 将每个元素放置在何处。我仍然不明白为什么我们必须这样做,我花了一天的大部分时间来解决问题,但至少现在它已经解决了。我真的很惊讶还有更多人没有看到这个问题。

关于android - CursorAdapter 在每个项目上调用 bindView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com