android - not - scrollBy no funciona correctamente en recyclerview anidado
scroll recyclerview (1)
Encontré una solución que usa el método scrollToPositionWithOffset
lugar usando scrollBy
. Incluso si ambos se desplazan en otra posición, tienen un proceso de trabajo muy diferente en la parte posterior.
Por ejemplo: si intenta utilizar scrollBy
para desplazar cualquier posición de píxel y su recyclerView no se ha configurado ningún adaptador, lo que significa que no hay ningún dato que mostrar y, por lo tanto, todavía no tiene ningún elemento, scrollBy
no funciona. RecyclerView usa su método scrollBy de scrollBy
. Entonces, en mi caso, estoy usando LinearLayoutManager
para las recyclerViews horizontales.
Veamos qué está haciendo:
int scrollBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
if (getChildCount() == 0 || dy == 0) {
return 0;
}
mLayoutState.mRecycle = true;
ensureLayoutState();
final int layoutDirection = dy > 0 ? LayoutState.LAYOUT_END : LayoutState.LAYOUT_START;
final int absDy = Math.abs(dy);
updateLayoutState(layoutDirection, absDy, true, state);
final int consumed = mLayoutState.mScrollingOffset
+ fill(recycler, mLayoutState, state, false);
if (consumed < 0) {
if (DEBUG) {
Log.d(TAG, "Don''t have any more elements to scroll");
}
return 0;
}
final int scrolled = absDy > consumed ? layoutDirection * consumed : dy;
mOrientationHelper.offsetChildren(-scrolled);
if (DEBUG) {
Log.d(TAG, "scroll req: " + dy + " scrolled: " + scrolled);
}
mLayoutState.mLastScrollDelta = scrolled;
return scrolled;
}
Como puede ver, scrollBy
ignora las intenciones de desplazamiento si no hay ningún elemento secundario en ese momento.
if (getChildCount() == 0 || dy == 0) {
return 0;
}
Por otro lado, scrollToPosition
puede funcionar perfectamente incluso si todavía no hay ningún conjunto de datos.
De acuerdo con la diapositiva Pro RecyclerView , la muestra siguiente funciona perfectamente. Sin embargo, no puedes hacer eso con scrollBy.
void onCreate(SavedInstanceState state) {
....
mRecyclerView.scrollToPosition(selectedPosition);
mRecyclerView.setAdapter(myAdapter);
}
Como resultado , he cambiado poco para usar scrollToPositionWithOffset()
.
Antes de esta implementación, estaba calculando la posición exacta de desplazamiento x como un píxel.
Después de eso, cuando el rollo se detuvo, calculando la primera posición visible completa al primer parámetro de scrollToPositionWithOffset()
.
Para el segundo parámetro, que es el desplazamiento, view.getLeft()
el valor utilizando la función view.getLeft()
que ayuda a obtener la posición izquierda de esta vista en relación con su elemento principal.
Y funciona perfectamente !!
Tengo un RecyclerView
desplazamiento vertical con desplazamiento interno de RecyclerViews en el interior como este.
Con esta implementación, los usuarios pueden desplazarse de forma sincronizada por cada reciclador horizontal. Sin embargo, cuando un usuario se desplaza verticalmente a la vista recicladora principal, una nueva vista de reciclador horizontal que acaba de adjuntarse en la ventana no se muestra en la misma posición de desplazamiento x. Esto es normal. Porque acaba de crear.
Entonces, intenté desplazarme a la posición desplazada antes de que se mostrara. Solo así:
Nota : esto está en el adaptador de la vista recicladora primaria cuya orientación es vertical.
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
CellColumnViewHolder viewHolder = (CellColumnViewHolder) holder;
if (m_nXPosition != 0) {
// this doesn''t work properly
viewHolder.m_jRecyclerView.scrollBy(m_nXPosition, 0);
}
}
Como puede ver, scrollBy
no afecta a la fila 10 , la fila 11 , la fila 12 y la fila 13 Después de eso, depuré el código para poder averiguar qué está sucediendo. Cuando configuro la posición de desplazamiento usando scrollBy, childCount () devuelve cero para la fila 10 , la fila 11 , la fila 12 y la fila 13 para que no se desplacen. Pero por qué ? y ¿Por qué otros trabajan?
- Cómo puedo arreglar esto ?
- ¿Está onViewAttachedToWindow en el lugar correcto para desplazar las nuevas recyclervViews adjuntas?
Nota : También he probado scrollToPosition()
, no tiene ningún problema como este. Pero no puedo usarlo en mi caso. Porque los usuarios pueden desplazarse a cualquier posición x que no sea la posición exacta. Así que necesito establecer la posición de desplazamiento usando el valor x en lugar de la posición.
Editar : puede verificar el código fuente