Diferenciación entre desplazamiento de usuario y cambio de página de programación en ViewPager
Tengo un android.support.v4.view.ViewPager
en mi aplicación y me gustaría diferenciar entre una programación de inicio de desplazamiento suave y un usuario iniciado toque de desplazamiento.
He ViewPager.OnPageChangeListener
un vistazo a ViewPager.OnPageChangeListener
y creo que la respuesta puede mentir allí, pero no estoy seguro de cómo.
- Cómo resolver UnsupportedOperationException El método necesario destroyItem no se anuló
- Soporte de vista de Android para ViewPager
- No se puede obtener la viewWidth después del primer diseño (WebView en un ViewPager)
- El título de ViewPager no aparece hasta que lo deslice
- ViewPager con el niño extensible
- Listview no actualizar en fragmento con las pestañas viewpager
- Android.support.v4.app.FragmentManager y android.app.FragmentManager en ViewPager
- FragmentPagerAdapter y FragmentStatePagerAdapter
- Viewpager no funciona correctamente en lollipop 5.0 cuando uso otros fragmentos
- ViewPager con la API de Google Maps v2: vista negra misteriosa
- Diferencia entre FragmentPagerAdapter con ViewPager con OffScreenLimit establecido en 1 y FragmentStatePagerAdapter?
- IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState con ViewPager
- La vista de Fragmento de ViewPager se pierde cuando el fragmento padre de ViewPager se oculta y luego se muestra
Aceptar, por lo que resulta que tenía razón sobre la respuesta que se encuentra en ViewPager.onPageChangeListener
. En particular reside en el uso de onPageScrollStateChanged(int state)
. Esencialmente hay tres estados que una página en un ViewPager
puede estar en:
- Arrastre: Indica que el paginador está siendo arrastrado por el usuario.
- Inactivo: Indica que el buscapersonas está en un estado inactivo, establecido.
- Asentamiento: Indica que el buscapersonas está en el proceso de asentamiento a una posición final.
Por lo tanto, el estado de arrastre sólo se produce cuando la página actual se está arrastrando físicamente por el usuario. Por lo tanto, cuando el usuario ha barrido una página los estados se producen en el siguiente orden: Arrastre -> Asentamiento -> Inactivo. Ahora, el onPageSelected(int position)
se llama entre los estados "Settling" y "Idle". Por lo tanto, con el fin de determinar si o no un cambio de página fue causado por un desplazamiento del usuario sólo hay que comprobar que el estado anterior era "arrastrar" y que el estado actual es "Asentamiento". A continuación, puede mantener una variable boolean
para rastrear si el cambio de página fue iniciado por el usuario o no y lo comprueba en su onPageSelected(int position)
.
Aquí está mi método onPageScrollStateChanged
public void onPageScrollStateChanged(int state) { if (previousState == ViewPager.SCROLL_STATE_DRAGGING && state == ViewPager.SCROLL_STATE_SETTLING) userScrollChange = true; else if (previousState == ViewPager.SCROLL_STATE_SETTLING && state == ViewPager.SCROLL_STATE_IDLE) userScrollChange = false; previousState = state; }
Las declaraciones if
y else if
no necesitan ser tan explícitas, pero lo hice por claridad.
Tiene razón al usar ViewPager.OnPageChangeListener
:
@Override public void onPageSelected(int arg0) { // programmatically-initiated } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { // user-initiated touch scroll }
Como alternativa, puede utilizar banderolas booleanas para diferenciar entre programmatically-initiated smooth scroll and a user-initiated touch scroll
. Por ejemplo, si utiliza setCurrentItem(int item)
para cambiar la página mediante programación, intente:
boolean progChange = false; .... .... .... progChange = true; setCurrentItem(somePageId); // Set progChange = true every time .... .... ....
Dentro de su ViewPager.OnPageChangeListener
:
@Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (progChange) { // programmatically-initiated } else { // user-initiated touch scroll } // Set progChange to false; progChange = false; } @Override public void onPageScrollStateChanged(int arg0) { }
- Java.lang.SecurityException:! @Too muchas alarmas (500) registradas de pid 10790 uid 10206
- ¿Cómo puedo extender correctamente una clase de diseño?