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/ )では、この問題について言及していません。
Butterknifeの著者であるJake Whartonによれば、unbind()
はFragments
にのみ必要です。課題トラッカーに関する次のコメントを参照してください。
https://github.com/JakeWharton/butterknife/issues/879
Q:
RecyclerView
で、ViewHolder
のバインドを解除するにはどうすればよいですか?A:する必要はありません。
onDestroyView()
にはFragments
のみが必要です。
その理由は
[
ViewHolders
]は、関連付けられたビューよりも長持ちしません。Fragment
はそうです。
言い換えると、Fragment
はViews
が破棄された後も存在し続ける可能性があるため、Fragment
から.unbind()
を呼び出して参照を解放する必要がありますViews
に(および関連付けられたメモリを再利用できるようにします)。
ViewHolder
の場合、ホルダーのライフサイクルは、保持するViews
と同じです。言い換えると、ViewHolder
とそのViews
は同時に破棄されるため、手動でクリアする必要のある参照が相互に残ることはありません。
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(); } }
unbind
からのビューをViewHolder
する必要はまったくありません。
それが役立つことを願っています
ドキュメントには、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を呼び出す必要はありません。
はい、そうです 。これは、フラグメントにのみ必要です。
それを使用するだけです:
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
if (unbinder != null) {
unbinder.unbind();
}
}
ジェイクウォートンは彼の文書で明確に言及しています
https://jakewharton.github.io/butterknife/
Unbindはフラグメントに対してのみ呼び出す必要があり、最も重要なことは、DestroyViewではなくonDestroyViewで呼び出す必要があります。