Android CursorAdapter对每个项目调用bindView

Android CursorAdapter对每个项目调用bindView,android,cursor,listadapter,Android,Cursor,Listadapter,我使用了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

我使用了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。但是,情况似乎并非如此。这对我来说是一个问题,因为我想根据光标数据选择适当的视图,但因为可以在newView之前调用bindView,所以这不起作用

这是一些奇怪的回收行为还是正常的/预期的?或者我删除了除ListView之外的所有内容,但它仍在这样做,代码是否有问题?我不太清楚为什么要尝试绑定尚未创建的视图,以及为什么会在第一项上调用两次newView

谢谢

顺便说一句,如果有人有一个简单的方法添加除法器到列表视图,我很想知道。我将尝试挖掘联系人示例,看看他们是如何做到这一点的

顺便说一句,如果有人想知道MergeAdapter是否很好,我会在其他情况下使用它。但是,我最终只编写了一个适配器来处理多个视图。它计算每个小项目的类型,将其存储在映射中,在创建适配器时对其进行初始化,并在notifyDataSetChanged中对其进行更新

然后您只需要让getViewTypeCount返回可能的视图数。和getItemViewType从映射返回基于0的类型,因此0-getViewTypeCount。如果你可以从你不需要地图的位置计算你的类型,但是在飞行中这样做是不可能的,所以我只是在需要的时候预先/重新计算

这对我来说是一个问题,因为我想根据光标数据选择适当的视图,但因为可以在newView之前调用bindView,所以这不起作用

是否覆盖了getViewTypeCount和getItemViewType

这是一些奇怪的回收行为还是正常的/预期的?或者我删除了除ListView之外的所有内容,但它仍在这样做,代码是否有问题

有些事情似乎很奇怪

顺便说一句,如果有人有一个简单的方法添加除法器到列表视图,我很想知道。我将尝试挖掘联系人示例,看看他们是如何做到这一点的

最后,如何向ListView添加分隔符几乎完全取决于分隔符何时出现的标准。不可能提供一刀切的解决方案

例如,my可以用于分隔符,分隔符之间的每一块内容都可以包含在它自己的ListAdapter中。这在某些情况下非常有效。但是,假设分隔符实际上是由一列确定的,例如数据库查询中的类别。在每个类别中运行大量子查询以将每个游标包装在其自己的SimpleCorsOrAdapter中供MergeAdapter使用将是一件痛苦的事情。更好的做法是创建一种不同类型的包装适配器,它可以根据检测到的类别值变化动态插入标题。我手头上没有这样一个适配器的样本,尽管它在我的18000项待办事项列表中

这对我来说是一个问题,因为我想根据光标数据选择适当的视图,但因为可以在newView之前调用bindView,所以这不起作用

是否覆盖了getViewTypeCount和getItemViewType

这是一些奇怪的回收行为还是正常的/预期的?或者我删除了除ListView之外的所有内容,但它仍在这样做,代码是否有问题

有些事情似乎很奇怪

顺便说一句,如果有人有一个简单的方法添加除法器到列表视图,我很想知道。我将尝试挖掘联系人示例,看看他们是如何做到这一点的

最后,如何向ListView添加分隔符几乎完全取决于分隔符何时出现的标准。不可能提供一刀切的解决方案


例如,my可以用于分隔符,分隔符之间的每一块内容都可以包含在它自己的ListAdapter中。这在某些情况下非常有效。但是,假设分隔符实际上是由一列确定的,例如数据库查询中的类别。在每个类别中运行大量子查询以将每个游标包装在其自己的SimpleCorsOrAdapter中供MergeAdapter使用将是一件痛苦的事情。更好的做法是创建一种不同类型的包装适配器,它可以根据检测到的类别值变化动态插入标题。我手头上没有这样一个适配器的示例,尽管它在我的18000项待办事项列表中…

我遇到了相同的问题,bindView被多次调用,确切地说是为了e 我的游标中的每个条目。。 我找到的修复方法是将我的布局切换到相对布局,如下所示:

  <?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每行调用一次bindView的唯一方法是在ListView上设置一个固定的高度。由于几乎任何线性布局都可以使用RelativeLayout重新创建,因此您应该能够切换这两个元素,然后告诉ui每个元素的放置位置。
我仍然不明白我们为什么要这样做,我花了一天的大部分时间来解决这个问题,但至少现在问题已经解决了。我真的很惊讶有更多的人没有看到这个问题。

我也遇到了同样的问题,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每行调用一次bindView的唯一方法是在ListView上设置一个固定的高度。由于几乎任何线性布局都可以使用RelativeLayout重新创建,因此您应该能够切换这两个元素,然后告诉ui每个元素的放置位置。
我仍然不明白我们为什么要这样做,我花了一天的大部分时间来解决这个问题,但至少现在问题已经解决了。我真的很惊讶有更多的人没有看到这个问题。

使用光标的getPosition方法查看项目位置

cursor.getPosition();

使用光标的getPosition方法查看项目位置

cursor.getPosition();

我尝试重写getViewTypeCount和getItemViewType,但虽然行为不同,但它似乎与我认为应该的不匹配。我确实尝试了MergeAdapter,它做了我想做的事情,尽管它会在您更新列表时导致光标出现问题。当ListView适配器直接设置为CursorAdapter时,一切正常,当我将ListView适配器设置为包含CursorAdapter和其他视图的MergeAdapter时,光标不会得到更新。。。不确定我是否需要managedCursor或是否需要修改MergeAdapter。我能够为registerDataSetObservercursor添加一些代码,该代码将调用BaseAdapter.notifyDataSetChanged或.NotifyDataSetValidated,默认情况下该代码不起任何作用。这似乎让每个人都很开心。这不是我忽略的原因吗?或者这只是一个不寻常的例子?@William:这可能是MergeAdapter的一个缺陷。我会调查的。谢谢我尝试重写getViewTypeCount和getItemViewType,但虽然行为不同,但它似乎与我认为应该的不匹配。我确实尝试了MergeAdapter,它做了我想做的事情,尽管它会在您更新列表时导致光标出现问题。当ListView适配器直接设置为CursorAdapter时,一切正常,当我将ListView适配器设置为包含CursorAdapter和其他视图的MergeAdapter时,光标不会得到更新。。。不确定我是否需要managedCursor或是否需要修改MergeAdapter。我能够为registerDataSetObservercursor添加一些代码,该代码将调用BaseAdapter.notifyDataSetChanged或.NotifyDataSetValidated,默认情况下该代码不起任何作用。这似乎让每个人都很开心。这不是我忽略的原因吗?或者这只是一个不寻常的例子?@William:这可能是MergeAdapter的一个缺陷。我会调查的。谢谢刚找到这个,你救了我一天!我为ListView的布局高度添加了wrap\u内容,它对列表中的所有项目使用了相同的视图…刚刚找到了这个,你就帮我节省了一天!我为ListView的布局高度设置了wrap\u内容,它对列表中的所有项目使用相同的视图。。。