2

这个问题与 StackOverflow 上的许多其他问题非常相似,但由于与此处的其他问题相比方法不同,我认为它值得自己发表。

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

不幸的是,我的列表视图没有被重新创建。我需要重新创建它们的原因是因为我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

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

  • adapter.notifyDataSetChanged()数据更新后调用。
  • 在数据更新后contentResolver.notifyChange(...)调用。adapter.notifyDataSetChanged()
  • 调用adapter.changeCursor(newCursor)后跟adapter.notifyDataSetChanged().
  • 调用view.invalidate()更改的特定列表项。

关于如何解决这个问题的任何其他建议?

编辑:我可能完全只是采取了错误的方法。我误解了适配器内视图的回收,我发现回收时使用了错误类型的视图。因此,我可能需要使用另一种方法来设置我的视图样式。我首先采用这种方法的原因是因为我希望使用样式,除了在 StackOverflow question 中解释的膨胀视图之外,无法以编程方式设置样式。我对在正确回收列表项视图的同时利用该答案的方法持开放态度。

4

1 回答 1

1

我最终根据这个 StackOverflow 答案找出了问题。我需要在我的适配器上覆盖getItemTypeCount和。getItemViewType

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

@Override
public int getViewTypeCount() {
    return 2;
}
于 2013-06-08T23:12:18.873 回答