webentwicklung-frage-antwort-db.com.de

Wo kann ich ButterKnife 8.x.x in einem ViewHolder lösen?

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.

22
Balázs Árva

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 die ViewHolder-Bindung?

A: Das musst du nicht. Nur Fragments muss in onDestroyView() eingegeben werden.

Der Grund ist das 

[ViewHolders] überlebt die zugehörige Ansicht nicht. Ein Fragment 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.

40
Tim Malseed

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 eine Unbinder-Instanz zurück, wenn Sie Rufe bind auf, um dies für dich zu tun. Rufen Sie die unbind-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();
  }
}

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

sie brauchen also keine Sicht von unbind zu ViewHolder.

Ich hoffe es wird helfen

10
piotrek1543

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.

3
Anton K

Ja, sie tun . Dies wird nur für Fragmente benötigt.

2
R. Zagórski

Benutze es einfach:

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

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.

0
Mini Chip