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 deUnbinder
cuando llama abind
para hacer esto por usted. Llame a su método deunbind
en 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
Fragments
necesitan estar enonDestroyView()
.
La razón es que
[
ViewHolders
] no sobreviven a la vista asociada. UnFragment
hace.
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.