Android TV: El elemento de RowsFragment no funciona en pocos casos

Estoy trabajando en una aplicación de Android TV y estoy enfrentando un extraño problema relacionado con los oyentes de clic de artículo: todo funciona bien, pero a veces el clic no se propaga, es muy probable que el oyente no esté configurado.

He subclasificado RowsFragment y estoy mostrando mis imágenes con filas de 6 elementos: significa que cada fila de la cuadrícula es en realidad una fila en el adaptador, aunque visualmente las fotos tienen el mismo mes. Por favor, eche un vistazo a la imagen para tener una mejor comprensión.

Introduzca aquí la descripción de la imagen

Ahora el problema: cuando inicie la aplicación y me desplazo hacia abajo, la primera fila que no es visible en la imagen de arriba (por lo que la cuarta fila, ya que aquí se procesan 3 filas), no recibe mis "clics", no pasa nada . Esto podría ser cierto también para las filas 5, 6, …, pero luego (no reconocí un patrón) las filas empiezan a ser de nuevo clicable (es decir, 8, 9, ..) Las primeras 3 filas son siempre clickable así .

Si vuelvo a desplazarme hacia arriba y las filas que no se pueden hacer clic en aparecerán en la pantalla de nuevo, ahora se pueden hacer clic.

En el onCreate del fragmento, llamo:
setOnItemViewClickedListener(new ItemViewClickedListener());
Y de acuerdo con la documentación esto debería anular el oyente establecido por la vista de elemento único. También se sugiere establecer un oyente, no ambos: de hecho, sólo se establece este para el fragmento.

En la clase Presenter del elemento de una sola fila, he intentado agregar un oyente de clics en el onCreateViewHolder para la vista y he descubierto que cuando se produce el problema, este oyente se llama.

Por lo tanto, parece que en algunas circunstancias, el oyente de fragmentos en general no anula el oyente de vista o no se establece en absoluto.

Lo que también me preocupa acerca de este problema, es que no puedo reproducirlo en el modo de depuración cuando establezco puntos de interrupción y detengo la animación de desplazamiento.

Estoy usando la última versión de Leanback:

 compile 'com.android.support:leanback-v17:25.3.1' 

El problema es reproducible en el Nvidia Shield TV (Android 7.0), no está seguro de otros dispositivos.

Actualización: lo que también es interesante es el hecho de que cuando un elemento no se puede hacer clic en una fila, esperaría que todos los elementos de la misma fila no se puedan hacer clic. En su lugar no es el caso, algunos son clicables, otros no.

Actualización 2: parece que el método onBind , en algunas ocasiones, encuentra getOnItemViewClickedListener para devolver null, por lo que el elemento de escucha de clics no está establecido. Eso es raro porque el oyente está configurado para la clase RowsFragment principal y funciona bien para la mayoría de los elementos, también los elementos en la misma fila de los que no funcionan.

Como solución, he encontrado esta solución: subclase el ListRowPresenter y establezca un ListRowPresenter clic ficticio.

 private class GroupedListRowPresenter extends ListRowPresenter { GroupedListRowPresenter(int focusZoomFactor) { super(focusZoomFactor); } @Override protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) { super.onBindRowViewHolder(holder, item); holder.setOnItemViewClickedListener(new BaseOnItemViewClickedListener() { @Override public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Object row) { Timber.d("item click from dummy listener: this should never happen!"); } }); } } 

No estoy cómodo con él, porque realmente no me gusta establecer un oyente de clic vacío, incluso si sé que se sobrepasará.

Actualización 3: el problema también es reproducible con la aplicación de ejemplo creada por Android Studio, por lo que parece no estar relacionada con algo malo en mi código. Por esta razón, he presentado un error: https://issuetracker.google.com/issues/62443122

Si está afectado por este problema también, por favor protagonice el problema anterior, por lo que obtendrá más atención, gracias.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.