Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo obtener un desplazamiento en RecyclerView ItemDecorator

He escrito dos ItemDecorator 's para RecyclerView . Cada uno añade un cierto desplazamiento superior en getItemOffsets() . Digamos:

  • El primer decorador agrega 20dp top offset
  • Segundo decrator agrega 30dp top offset

Ahora, cuando agrego ambos a RecyclerView , cada artículo está correctamente compensado por 50dp, eso es bueno.

  • Cómo iniciar un intento de un ResolveInfo
  • ¿Cómo cambiar la Actividad dinámica?
  • Cordova Error usando Cordova-Android 6.2.0 - getFileResources no es una función
  • Cómo alinear a la derecha PreferencesActivity en android?
  • Dual Sim Android
  • ¿Cómo puedo crear un código común para partes de las actividades de Android?
  • Pero aquí viene la pregunta: ¿Cómo obtengo este desplazamiento en onDraw / onDrawOver ?

    Por lo general decoradores dibujar sus cosas al atravesar parent.getChildAt(i) cosas y obtener child.getTop() por ejemplo, para dibujar sobre la vista de niño de RecyclerView .

    Pero en este caso, hacerlo mezclaría el dibujo de otro decorador, porque también usaría child.getTop() .

    Así que por el momento parece que ambos decoradores necesitan saber sobre el otro y la altura del otro.

    ¿Me estoy perdiendo de algo? Espero que lo sea.

    EDIT: Informé de un problema a Android Tracker tema y parece que esto será trabajado. Actúela para realizar un seguimiento del progreso: https://code.google.com/p/android/issues/detail?id=195746

  • SyncAdapter sin un ContentProvider
  • ¿Hay una herramienta para encontrar recursos no utilizados en un proyecto de Android?
  • Problemas con appwidget appWidgetIds (instancias reales y fantasmas de widget)
  • ¿Hay una manera de tener un campo de entrada numérico enmascarado?
  • RequestLayout () incorrectamente llamado por android.widget.RelativeLayout android
  • ¿Cómo animar una matriz para "recortar" una imagen?
  • One Solution collect form web for “Cómo obtener un desplazamiento en RecyclerView ItemDecorator”

    No, usted no está perdiendo nada. Pero usted puede obtener los valores necesarios en getItemOffsets , aunque parece un poco sucio para mí.

    Básicamente sólo hay una opción de obtener la altura decorada que no sea la gestión de decoraciones usted mismo: LayoutManager.getDecoratedTop();

    OnDraw

    En onDraw se obtiene el lienzo completo del recyclerView, c.getClipBounds() no contiene ninguna información. Aunque el javadoc de adición de decoraciones dice que las decoraciones sólo deben dibujar con sus límites.

    Además, conseguir que parent.getLayoutManager().getDecoratedTop() le dará los mismos valores en cada decoración, ya que ya es demasiado tarde aquí, esos valores son para propósitos de diseño.

    Estamos demasiado tarde, el diseño está hecho y lo perdimos.

    GetItemOffsets

    Tenga en cuenta que he probado lo siguiente con un LinearLayoutManager y que también podría no funcionar con los demás (definitivamente no con la mayoría de los personalizados). Puesto que estoy confiando en la medición de la ocurrencia entre esas llamadas, que no está documentada, la solución dada podría romper con alguna versión futura.

    Simplemente sentí que necesitaba esa negación. He encontrado una solución de trabajo (ver el mOffset ):

     @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { mOffset = parent.getLayoutManager().getTopDecorationHeight(view); outRect.set(0, 10, 0, 0); } 

    Esto funciona, porque el recyclerview, al calcular la inserción total del niño, está actualizando la variable local LayoutParams del paquete de vistas . Si bien no podemos acceder a la variable de parámetro de diseño en sí, llamar a getTopDecorationHeight utiliza realmente la inserción (actualmente) sucia, dándonos el valor adecuado.
    Por lo tanto, usted puede obtener la compensación de las decoraciones anteriores antes de aplicar su propio!

    Para aplicarlo, simplemente quite las otras decoraciones compensadas al dibujar su decoración:

     c.drawRect(child.getLeft() + child.getTranslationX(), mOffset + layoutManager.getDecoratedTop(child) + child.getTranslationY(), child.getRight() + child.getTranslationX(), child.getBottom() + child.getTranslationY(), paint); 

    Esto realmente se aplican las decoraciones de otros compensar, a continuación, dibujar su propio de la parte superior correcta .

    Algunos problemas

    Esta es ahora una solución básica de trabajo para el usecase por defecto . PERO . Si tiene diferentes compensaciones dependiendo del elemento VIEW_TYPE o de la posición del adaptador, las cosas se ponen difíciles.

    Usted duplicará su lógica y mantendrá varias compensaciones para varios tipos de vista o tendrá que almacenar / recuperar el desplazamiento para cada vista o tipo de vista.

    Para ello, puede agregar alguna etiqueta personalizada con view.setTag(key, object) o hacer algo similar con el objeto RecyclerView.State que se está transmitiendo.

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