Evitar SwipeRefresh mientras se está acelerando en android

Tengo un ListView tiene fastScroll siempre habilitado y la implementación de SwipeRefresh . Cuando deslizo la lista hacia abajo, actualiza la lista. Mi problema es fastScroll . Si la lista tiene su primer elemento visible o decir en su parte superior inicial, entonces si desplaza el fastScrollThumb hacia abajo, hace que el efecto de desplazamiento no se desplace hacia abajo. ¿Hay de fastScrollThumb manera / solución que si fastScrollThumb el fastScrollThumb , entonces no debería hacer Swipe actualizar efecto en lugar de que debe desplazarse hacia abajo como comportamiento natural.

Introduzca aquí la descripción de la imagen

EDITADO Mi XML Layout es el siguiente:

  <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:id="@+id/buttons_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="10dp"> <ImageView android:id="@+id/SubmitButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/neoo_tab_selector" /> </RelativeLayout> <ListView android:id="@id/android:list" style="@style/NeeoContactListView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/buttons_layout" android:layout_marginTop="10dp" /> </RelativeLayout> </android.support.v4.widget.SwipeRefreshLayout> 

My Logic for onScroll para habilitar / deshabilitar el SwipeRefresh es:

  getListView().setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { boolean enable = false; if(getListView() != null && getListView().getChildCount() > 0){ // check if the first item of the list is visible boolean firstItemVisible = getListView().getFirstVisiblePosition() == 0; // check if the top of the first item is visible boolean topOfFirstItemVisible = getListView().getChildAt(0).getTop() == 0; // enabling or disabling the refresh layout enable = firstItemVisible && topOfFirstItemVisible; } if(enable){ enableSwipe(); }else{ disableSwipe(); } } }); 

Acabo de mirar en la documentación de la SwipeRefreshLayout y creo que mencionan lo que está buscando:

… Si el oyente determina que no debe haber una actualización, debe llamar a setRefreshing(false) para cancelar cualquier indicación visual de una actualización. Si una actividad desea mostrar sólo la animación de progreso, debe llamar a setRefreshing(true) . Para desactivar la animación de gestos y progresos, llame a setEnabled(false) en la vista.

Así que tienes algunas opciones, primero intentaría jugar con setEnabled() o setRefreshing() , pero para usar correctamente esos métodos primero debemos ser capaces de detectar si el ListView es desplazamiento rápido. ¡No hay ningún oyente o cualquier cosa para el desplazamiento rápido pero usted puede conseguir el estado con la reflexión! Sobre la base de esta excelente y seriamente subestimado respuesta he escrito un FastScrollListener que se puede utilizar como un OnScrollListener :

 this.listView.setFastScrollEnabled(true); this.listView.setOnScrollListener(new FastScrollListener(this.listView) { @Override protected void onFastScrollStateChanged(AbsListView view, FastScrollState state) { // This line disabled the SwipeRefreshLayout // whenever the user is fast scrolling swipeRefreshLayout.setEnabled(state != FastScrollState.DRAGGING); } @Override protected void onFastScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); 

También puede intentar llamar setRefreshing() lugar de setEnabled() si setEnabled() no funciona.

Y aquí está el código del FastScrollListener :

 public abstract class FastScrollListener implements AbsListView.OnScrollListener { private final int STATE_DRAGGING; private final int STATE_VISIBLE; private final int STATE_NONE; public enum FastScrollState { DRAGGING, VISIBLE, NONE, UNKNOWN } private FastScrollState fastScrollState = FastScrollState.UNKNOWN; private Field stateField; private Object mFastScroller; public FastScrollListener(AbsListView listView) { try { final Field fastScrollerField = AbsListView.class.getDeclaredField("mFastScroller"); fastScrollerField.setAccessible(true); mFastScroller = fastScrollerField.get(listView); final Field stateDraggingField = mFastScroller.getClass().getDeclaredField("STATE_DRAGGING"); stateDraggingField.setAccessible(true); STATE_DRAGGING = stateDraggingField.getInt(mFastScroller); final Field stateVisibleField = mFastScroller.getClass().getDeclaredField("STATE_VISIBLE"); stateVisibleField.setAccessible(true); STATE_VISIBLE = stateVisibleField.getInt(mFastScroller); final Field stateNoneField = mFastScroller.getClass().getDeclaredField("STATE_NONE"); stateNoneField.setAccessible(true); STATE_NONE = stateNoneField.getInt(mFastScroller); stateField = mFastScroller.getClass().getDeclaredField("mState"); stateField.setAccessible(true); fastScrollState = getFastScrollState(); } catch (NoSuchFieldException e) { throw new IllegalStateException("Could not find required fields for fast scroll detection!", e); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not find required fields for fast scroll detection!", e); } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { updateFastScrollState(view); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { updateFastScrollState(view); updateFastScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } private void updateFastScrollState(AbsListView view) { if (stateField != null) { final FastScrollState state = getFastScrollState(); if (fastScrollState != state) { fastScrollState = state; onFastScrollStateChanged(view, state); } } } private void updateFastScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(fastScrollState == FastScrollState.DRAGGING) { onFastScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } } private FastScrollState getFastScrollState() { try { final int state = stateField.getInt(mFastScroller); if (state == STATE_DRAGGING) { return FastScrollState.DRAGGING; } if (state == STATE_VISIBLE) { return FastScrollState.VISIBLE; } if (state == STATE_NONE) { return FastScrollState.NONE; } return FastScrollState.UNKNOWN; } catch (IllegalAccessException e) { throw new IllegalStateException("Could not read fast scroll state!", e); } } protected abstract void onFastScrollStateChanged(AbsListView view, FastScrollState state); protected abstract void onFastScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount); } 

¡Espero poder ayudarle y si usted tiene alguna otra pregunta por favor no dude en preguntar!


EDIT: Pruebe esto, pero dudo que funcione:

 @Override protected void onFastScrollStateChanged(AbsListView view, FastScrollState state) { boolean enable = false; if (getListView().getChildCount() > 0) { boolean firstItemVisible = getListView().getFirstVisiblePosition() == 0; boolean topOfFirstItemVisible = getListView().getChildAt(0).getTop() == 0; enable = firstItemVisible && topOfFirstItemVisible; } refreshLayout.setEnabled(enable); } 
  • Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.