2

この質問は、StackOverflow に関する他の多くの質問と非常によく似ていますが、ここの他の質問とはアプローチが異なるため、独自の投稿に値すると思います。

を拡張するカスタム アダプターがありますCursorAdapternotifyChangeカーソルを更新するために、データを更新し、適切な 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がリスト データを更新していることですが、必要なビューを .sys 経由で再作成していないことですnewView

私が試した他のいくつかのことは、同様に機能しませんでした:

  • adapter.notifyDataSetChanged()データが更新された後に呼び出されます。
  • データが更新さcontentResolver.notifyChange(...)れた後に呼び出されます。adapter.notifyDataSetChanged()
  • と呼ばれ、adapter.changeCursor(newCursor)その後にadapter.notifyDataSetChanged().
  • view.invalidate()変更された特定のリスト項目で呼び出されます。

これにアプローチする方法に関する他の提案はありますか?

編集:私はまったく間違ったアプローチを取っているだけかもしれません。アダプター内でのビューのリサイクルを誤解していました。リサイクル時に間違ったタイプのビューが使用されているようです。そのため、おそらく別のアプローチを使用してビューのスタイルを設定する必要があります。そもそもこのアプローチを採用した理由は、この StackOverflow question で説明されているように、ビューを膨らませる以外にプログラムで設定できないスタイルを使用したいという私の願望によるものです。リスト項目ビューを適切にリサイクルしながら、その答えを利用するアプローチを受け入れます。

4

1 に答える 1

1

この StackOverflow answerに基づいて問題を突き止めました。私は自分のアダプタでオーバーライドする必要が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 に答える