android - 在 CursorAdapter 中更改光标未正确更新列表项 View

标签 android android-listview cursor android-cursoradapter notifydatasetchanged

这个问题与 StackOverflow 上的许多其他问题非常相似,但我认为它值得单独发表,因为与此处的其他问题相比,方法有所不同。

我有一个扩展 CursorAdapter 的自定义适配器。我正在更新数据并在适当的 URI 上调用 notifyChange 以刷新光标。在调试中,我可以看到它工作正常。

不幸的是,我的 ListView 没有被重新创建。我需要重新创建它们的原因是因为我在适配器上实现了 newView:

public View newView(final Context context, final Ingredient ingredient, final ViewGroup parent) {
    final int layout = ingredient.isOwned() ? LAYOUT_OWNED : LAYOUT_UNOWNED;
    final View view = LayoutInflater.from(context).inflate(layout, null);

    // ... ViewHolder magic

    return view;
}

问题是调用 notifyChange 正在更新列表数据,但它没有通过 newView 重新创建我需要的 View 。

以下是我尝试过但同样无效的其他一些方法:

  • 在数据更新后调用了 adapter.notifyDataSetChanged()
  • 在数据更新后调用 contentResolver.notifyChange(...),然后调用 adapter.notifyDataSetChanged()
  • 调用 adapter.changeCursor(newCursor),然后调用 adapter.notifyDataSetChanged()
  • 对发生变化的特定列表项调用了 view.invalidate()

关于如何处理这个问题还有其他建议吗?

编辑:我可能完全采用了错误的方法。我误解了适配器内 View 的回收,我看到回收时使用了错误类型的 View 。因此,我可能需要使用另一种方法来设计我的 View 样式。我首先采用这种方法的原因是因为我希望使用样式,除了将 View 膨胀为 explained in this StackOverflow question 之外不能以编程方式设置样式。 .我对在正确回收列表项 View 的同时利用该答案的方法持开放态度。

最佳答案

我最终根据 this StackOverflow answer 找出了问题.我需要覆盖适配器上的 getItemTypeCountgetItemViewType

@Override
public int getItemViewType(int position) {
    return getItem(position).isOwned() ? 1 : 0;
}

@Override
public int getViewTypeCount() {
    return 2;
}

关于android - 在 CursorAdapter 中更改光标未正确更新列表项 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17004240/

相关文章:

android - 我可以预加载 Animation Drawable 吗?

java - Android DataPickerDialog onDateChanged 未触发

C# 列表问题(Android/Monodroid ListView 搜索)

javascript - 如何将此 css 转换为 javascript

jquery - SVG url 光标不改变光标

android - 从服务器获取数据时 Android 中的 Listview

android - Navigation Drawer 与 Action Bar 略微重叠

android - 可搜索 ListView

android - android崩溃中的自定义列表

qt - 如何在 Qt 环境中将鼠标光标限制为矩形(在 Ubuntu 12.04 中,而不是 Windows 中)