web-dev-qa-db-ja.com

ViewHolderでButterKnife 8.x.xのバインドを解除する場所

ButterKnife注釈を使用するRecycleView.ViewHolderクラスがあります。

このViewHolderクラスのコードもunbind()する必要がありますか?

public class AView extends RecyclerView.ViewHolder
{
    @BindView(R.id.a_text_view) TextView aText;

    public AView(final View view)
    {
        super(view);
        ButterKnife.bind(this, view); // It returns an Unbinder, but where should I call its unbind()?
    }
}

ドキュメント( http://jakewharton.github.io/butterknife/ )では、この問題について言及していません。

26
Balázs Árva

Butterknifeの著者であるJake Whartonによれば、unbind()Fragmentsにのみ必要です。課題トラッカーに関する次のコメントを参照してください。

https://github.com/JakeWharton/butterknife/issues/879

Q:RecyclerViewで、ViewHolderのバインドを解除するにはどうすればよいですか?

A:する必要はありません。 onDestroyView()にはFragmentsのみが必要です。

その理由は

[ViewHolders]は、関連付けられたビューよりも長持ちしません。 Fragmentはそうです。

言い換えると、FragmentViewsが破棄された後も存在し続ける可能性があるため、Fragmentから.unbind()を呼び出して参照を解放する必要がありますViewsに(および関連付けられたメモリを再利用できるようにします)。

ViewHolderの場合、ホルダーのライフサイクルは、保持するViewsと同じです。言い換えると、ViewHolderとそのViewsは同時に破棄されるため、手動でクリアする必要のある参照が相互に残ることはありません。

42
Tim Malseed

unbind()メソッドを使用する理由と理由は次のとおりです。

バインドのリセット

フラグメントには、アクティビティとは異なるビューライフサイクルがあります。 onCreateViewでフラグメントをバインドする場合、onDestroyViewでビューをnullに設定します。これを行うためにUnbinderを呼び出すと、バターナイフはbindインスタンスを返します。適切なライフサイクルコールバックでそのunbindメソッドを呼び出します。

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;
  private Unbinder unbinder;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }

  @Override public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }
}

From: http://jakewharton.github.io/butterknife/#reset

unbindからのビューをViewHolderする必要はまったくありません。

それが役立つことを願っています

11
piotrek1543

ドキュメントには、ViewHolderでこのライブラリを使用する方法を示す例があります。

static class ViewHolder {
    @BindView(R.id.title) TextView name;
    @BindView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }

したがって、ViewHolderのunbindを呼び出す必要はありません。

4
Anton K

はい、そうです 。これは、フラグメントにのみ必要です。

2
R. Zagórski

それを使用するだけです:

@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
    if (unbinder != null) {
        unbinder.unbind();
    }
}
0
AndroSco

ジェイクウォートンは彼の文書で明確に言及しています

https://jakewharton.github.io/butterknife/

Unbindはフラグメントに対してのみ呼び出す必要があり、最も重要なことは、DestroyViewではなくonDestroyViewで呼び出す必要があります。

0
Mini Chip