这个问题与 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 找出了问题.我需要覆盖适配器上的 getItemTypeCount
和 getItemViewType
。
@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/