Ich habe eine RecycleView.ViewHolder-Klasse, die ButterKnife-Annotationen verwendet.
Sollte mein Code auch in dieser ViewHolder-Klasse aufheben ()?
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()?
}
}
Die Dokumente ( http://jakewharton.github.io/butterknife/ ) sprechen nicht über dieses Problem.
Laut Jake Wharton, Autor von Butterknife, ist unbind()
nur für Fragments
erforderlich. Siehe diesen Kommentar zum Problem-Tracker:
https://github.com/JakeWharton/butterknife/issues/879
F: Wie lösen wir in
RecyclerView
dieViewHolder
-Bindung?A: Das musst du nicht. Nur
Fragments
muss inonDestroyView()
eingegeben werden.
Der Grund ist das
[
ViewHolders
] überlebt die zugehörige Ansicht nicht. EinFragment
tut.
Mit anderen Worten, da ein Fragment
nach der Zerstörung seines Views
weiterhin bestehen kann, müssen Sie .unbind()
von einem Fragment
aufrufen, um den Verweis auf Views
freizugeben (und den zugehörigen Speicher freigeben zu lassen).
Bei einem ViewHolder
ist der Lebenszyklus des Inhabers derselbe wie der Views
, den er hält. Mit anderen Worten, die ViewHolder
und ihre Views
werden zur gleichen Zeit zerstört. Es gibt also nie einen verweilenden Verweis von einem zum anderen, den Sie manuell löschen müssen.
Hier ist eine Erklärung, WANN und WARUM die unbind()
-Methode verwendet wird:
BINDUNGS-RESET
Fragmente haben einen anderen Ansichtslebenszyklus als Aktivitäten. Wann Um ein Fragment in
onCreateView
zu binden, setzen Sie die Ansichten in .__ auf null.onDestroyView
. Buttermesser gibt eineUnbinder
-Instanz zurück, wenn Sie Rufebind
auf, um dies für dich zu tun. Rufen Sie dieunbind
-Methode in der angemessener Lebenszyklus-Rückruf.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(); } }
sie brauchen also keine Sicht von unbind
zu ViewHolder
.
Ich hoffe es wird helfen
Das Dokument enthält ein Beispiel, das die Verwendung dieser Bibliothek im ViewHolder veranschaulicht:
static class ViewHolder {
@BindView(R.id.title) TextView name;
@BindView(R.id.job_title) TextView jobTitle;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
Sie müssen also den ViewHolder nicht aufheben.
Ja, sie tun . Dies wird nur für Fragmente benötigt.
Benutze es einfach:
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
if (unbinder != null) {
unbinder.unbind();
}
}
Jakewharton hat in seiner Dokumentation deutlich erwähnt
https://jakewharton.github.io/butterknife/
Unbind sollte nur für Fragmente aufgerufen werden und vor allem sollte es in onDestroyView anstelle von DestroyView aufgerufen werden.