studio - butter knife android
¿Dónde debo desenlazar ButterKnife 8.xx en un ViewHolder? (5)
Aquí hay una explicación de CUÁNDO y POR QUÉ usar el método unbind() :
Restablecer vinculante
Los fragmentos tienen un ciclo de vida de vista diferente al de las actividades. Al vincular un fragmento en
onCreateView, establezca las vistas en nulo enonDestroyView. Butter Knife devuelve una instancia deUnbindercuando llama abindpara hacer esto por usted. Llame a su método deunbinden la devolución de llamada apropiada del ciclo de vida.
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(); } }
por lo que no necesita unbind ninguna vista de ViewHolder .
Espero que ayude
Tengo una clase de RecycleView.ViewHolder que usa anotaciones de ButterKnife.
¿Debería mi código desvincular () en esta clase ViewHolder también?
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()?
}
}
Los documentos ( http://jakewharton.github.io/butterknife/ ) no hablan sobre este problema.
Hay un ejemplo en el documento, que muestra cómo usar esta biblioteca en 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);
}
}
Por lo tanto, no es necesario llamar a desvincular para su ViewHolder.
Según Jake Wharton, autor de Butterknife, unbind() solo se requiere para Fragments . Ver este comentario en el rastreador de problemas:
https://github.com/JakeWharton/butterknife/issues/879
P: En
RecyclerView, ¿cómo desenlazamos elViewHolder?A: No es necesario. Solo los
Fragmentsnecesitan estar enonDestroyView().
La razón es que
[
ViewHolders] no sobreviven a la vista asociada. UnFragmenthace.
En otras palabras, debido a que un Fragment puede continuar existiendo después de que se destruyan sus Views , debe llamar a .unbind() desde un Fragment para liberar la referencia a las Views (y permitir que se .unbind() la memoria asociada).
Con un ViewHolder , el ciclo de vida del titular es el mismo que el de las Views que posee. En otras palabras, ViewHolder y sus Views se destruyen al mismo tiempo, por lo que nunca hay una referencia persistente de una a otra que necesite borrar manualmente.
Solo úsalo:
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
if (unbinder != null) {
unbinder.unbind();
}
}
http://jakewharton.github.io/butterknife/#reset . Esto solo es necesario para los fragmentos.