studio butter android android-layout android-recyclerview android-viewholder butterknife

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 en onDestroyView . Butter Knife devuelve una instancia de Unbinder cuando llama a bind para hacer esto por usted. Llame a su método de unbind 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(); } }

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

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 el ViewHolder ?

A: No es necesario. Solo los Fragments necesitan estar en onDestroyView() .

La razón es que

[ ViewHolders ] no sobreviven a la vista asociada. Un Fragment 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(); } }