No puedo desactivar el desplazamiento en el RecyclerView
. Intenté llamar rv.setEnabled(false)
pero todavía puedo desplazarme.
¿Cómo puedo desactivar el desplazamiento?
android
scroll
android-recyclerview
Zsolt Safrany
fuente
fuente
RecyclerView
si no quieres desplazarte?View
sobre la parte superiorRecyclerView
, alternando entreVISIBLE
yGONE
según sea necesario, pero fuera de lugar, su enfoque parece razonable.Respuestas:
Debe anular el administrador de diseño de su vista de reciclaje para esto. De esta manera, solo deshabilitará el desplazamiento, ninguna de las otras funcionalidades. Aún podrá manejar clics o cualquier otro evento táctil. Por ejemplo:-
Original:
Aquí, utilizando el indicador "isScrollEnabled", puede habilitar / deshabilitar la funcionalidad de desplazamiento de su vista de reciclaje temporalmente.
También:
Simplemente anule su implementación existente para deshabilitar el desplazamiento y permitir hacer clic.
fuente
La verdadera respuesta es
Más información en la documentación.
fuente
NestedScrollView
:,android.support.v4.widget.NestedScrollView
como se describe aquí, por chessdork: stackoverflow.com/questions/37846245/…La respuesta REAL REAL es: Para API 21 y superior:
No se necesita código java. Puedes configurar
android:nestedScrollingEnabled="false"
en xml:fuente
Esta es una solución un poco complicada pero funciona; puede habilitar / deshabilitar el desplazamiento en el
RecyclerView
.Este es un
RecyclerView.OnItemTouchListener
evento de robo vacío de cada toque, lo que desactiva el objetivoRecyclerView
.Utilizándolo:
fuente
Esto funciona para mi:
fuente
Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
return e.getAction() == MotionEvent.ACTION_MOVE;
lugar dereturn true;
tan solo se cancelan los eventos de desplazamiento / deslizamiento.Puede deshabilitar el desplazamiento congelando su RecyclerView.
Congelar:
recyclerView.setLayoutFrozen(true)
Para descongelar:
recyclerView.setLayoutFrozen(false)
fuente
Crear clase que extienda la clase RecyclerView
Esto deshabilitará el evento de desplazamiento, pero no los eventos de clic
Use esto en su XML, haga lo siguiente:
fuente
Si solo deshabilita la funcionalidad de desplazamiento de
RecyclerView
, puede usar elsetLayoutFrozen(true);
método deRecyclerView
. Pero no se puede desactivar el evento táctil.fuente
fuente
Hay una respuesta realmente simple.
El código anterior deshabilita el desplazamiento vertical de RecyclerView.
fuente
Otra alternativa es
setLayoutFrozen
, pero viene con muchos otros efectos secundarios.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean)
fuente
Escribió una versión de Kotlin:
uso:
fuente
Extienda
LayoutManager
y anulecanScrollHorizontally()
ycanScrollVertically()
desactive el desplazamiento.Tenga en cuenta que insertar elementos al principio no se desplazará automáticamente hacia el principio, para evitar esto haga algo como:
fuente
Sé que esto ya tiene una respuesta aceptada, pero la solución no tiene en cuenta un caso de uso que encontré.
Específicamente, necesitaba un elemento de encabezado en el que todavía se pudiera hacer clic, pero deshabilité el mecanismo de desplazamiento de RecyclerView. Esto se puede lograr con el siguiente código:
fuente
Como
setLayoutFrozen
está en desuso, puede desactivar el desplazamiento congelando su RecyclerView mediantesuppressLayout
.Congelar:
Para descongelar:
fuente
en XML: -
Puedes añadir
android:nestedScrollingEnabled="false"
en el archivo XML de diseño RecyclerView secundario
o
en Java: -
childRecyclerView.setNestedScrollingEnabled(false);
a su RecyclerView en código Java.
Usando ViewCompat (Java): -
childRecyclerView.setNestedScrollingEnabled(false);
solo funcionará en android_version> 21 dispositivos. para trabajar en todos los dispositivos use lo siguienteViewCompat.setNestedScrollingEnabled(childRecyclerView, false);
fuente
Por alguna razón, la respuesta de @Alejandro Gracia comienza a funcionar solo después de unos segundos. Encontré una solución que bloquea el RecyclerView instantáneamente:
fuente
Anule onTouchEvent () y onInterceptTouchEvent () y devuelva false si no necesita OnItemTouchListener. Esto no deshabilita OnClickListeners de ViewHolders.
fuente
Puede agregar esta línea después de configurar su adaptador
Ahora su vista de reciclaje funcionará con desplazamiento suave
fuente
He estado luchando en este problema durante una hora, por lo que me gustaría compartir mi experiencia. Para la solución layoutManager está bien, pero si desea volver a habilitar el desplazamiento, el reciclador volverá al principio.
La mejor solución hasta ahora (al menos para mí) es usar el método @Zsolt Safrany pero agregar getter y setter para que no tenga que quitar o agregar OnItemTouchListener.
De la siguiente manera
Uso
fuente
En Kotlin, si no desea crear una clase adicional solo para establecer un valor, puede crear una clase anónima desde LayoutManager:
fuente
Así es como lo hice con el enlace de datos:
En lugar de "verdadero", utilicé una variable booleana que cambió en función de una condición para que la vista del reciclador cambiara entre estar deshabilitada y habilitada.
fuente
Encontré un fragmento que contiene múltiples RecycleView, por lo que solo necesito una barra de desplazamiento en lugar de una barra de desplazamiento en cada RecycleView.
Así que solo puse el ScrollView en el contenedor principal que contiene las 2 RecycleViews y lo uso
android:isScrollContainer="false"
en el RecycleViewfuente
Añadir
en su hijo de SrollView o NestedScrollView (y padre de ListView, recyclerview y gridview cualquiera)
fuente
Hay una forma más directa de deshabilitar el desplazamiento (técnicamente es más bien la intercepción de un evento de desplazamiento y finalizarlo cuando se cumple una condición), utilizando solo la funcionalidad estándar.
RecyclerView
tiene el método llamadoaddOnScrollListener(OnScrollListener listener)
, y usando solo esto puede evitar que se desplace, así:Caso de uso: supongamos que desea deshabilitar el desplazamiento cuando hace clic en uno de los elementos dentro
RecyclerView
para poder realizar algunas acciones con él, sin distraerse desplazándose accidentalmente a otro elemento, y cuando haya terminado con él, simplemente haga clic en el elemento nuevamente para habilitar el desplazamiento. Para eso, querrá adjuntarOnClickListener
a cada elemento dentroRecyclerView
, por lo que cuando hace clic en un elemento, se alternaríaisItemSelected
defalse
atrue
. De esta forma, cuando intente desplazarse,RecyclerView
llamará automáticamente al métodoonScrollStateChanged
y, puesto que estáisItemSelected
configurado entrue
, se detendrá inmediatamente, antes deRecyclerView
tener la oportunidad, bueno ... de desplazarse.Nota: para una mejor usabilidad, intente usar en
GestureListener
lugar deOnClickListener
evitaraccidental
clics.fuente
stopScroll()
no es para congelar el desplazamiento, es solo para detener / detener el desplazamiento de la vista de reciclaje.isItemSelected
set totrue
. De lo contrario, necesitaría un RecyclerView personalizado para deshabilitar el desplazamiento para siempre y quería evitarlo ya que solo necesitaba un poco de funcionalidad adicional, que proporciona esta solución.Simplemente agregue esto a su vista de reciclaje en xml
Me gusta esto
fuente
Para detener el desplazamiento táctil, siga desplazándose mediante comandos:
if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);
fuente