studio recyclerview pullrefresh hacer como android android-layout swiperefreshlayout

android - recyclerview - SwipeRefreshLayout: desliza hacia abajo para actualizar pero no para mover la vista hacia abajo



refresh layout android studio (5)

Después de mi prueba y error, encontré una solución de

http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/

Para las personas que pueden implementar SwipeRefreshLayout, para lograrlo

PASO 1: DESCARGAR android-support v4 (Open Source) de github

PASO 2: COPIA siguiente clase java a su proyecto src

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

note1- (Refactor SwipeRefreshLayout a mySwipeRefreshLayout para evitar confusiones con el original) note2- (Corrige estas clases y utiliza el origen entre ellos en lugar de v4)

PASO 3: CÓDIGO DE ACTUALIZACIÓN uso

  • mySwipeRefreshLayout en lugar de
  • SwipeRefreshLayout

PASO 4: USO DE LA DISPOSICIÓN DE ACTUALIZACIÓN

  • com.yourpackage.mySwipeRefreshLaout en lugar de
  • android.support.v4.widget.SwipeRefreshLayout

PASO 5: en su mySwipeRefreshLayout.java, busque y cambie a un código siguiente

private void updateContentOffsetTop ( int targetTop) { final int currentTop = mTarget.getTop (); if (targetTop> mDistanceToTriggerSync) { targetTop = ( int ) mDistanceToTriggerSync; } else if (targetTop < 0 ) { targetTop = 0 ; } // SetTargetOffsetTopAndBottom (targetTop - currentTop); setTargetOffsetTopAndBottom ( 0 ); // MOD: Prevent Scroll Down Animation }

Es posible ?? como un título dijo

deslícese hacia abajo para actualizar el diseño pero pegue el diseño no lo mueva hacia abajo a lo largo de la ráfaga de deslizamiento

Gracias, estoy usando SwipeRefreshLayout


Gracias a Jongz Puangput por la solución alternativa, pero quiero sugerir otra solución, que me parece más simple.

Para evitar el desplegable del elemento secundario de SwipeRefreshLayout, puede proporcionar su propia vista secundaria con el método offsetTopAndBottom modificado de la offsetTopAndBottom manera:

public class FixedRelativeLayout extends RelativeLayout { ... @Override public void offsetTopAndBottom(int offset) { // Ignoring movement from SwipeRefreshLayout super.offsetTopAndBottom(0); } }

Eso funciona para mí, espero que ayude a cualquiera.


Lo intentas de esta manera

listView.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(listView != null && listView.getChildCount() > 0){ // check if the first item of the list is visible boolean firstItemVisible = listView.getFirstVisiblePosition() == 0; // check if the top of the first item is visible boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0; // enabling or disabling the refresh layout enable = firstItemVisible && topOfFirstItemVisible; } swipeRefreshLayout.setEnabled(enable); }});

Este código no funciona si listView tiene paddingTop


Puede encontrar la vista de reciclador actualmente en la parte superior y sabiendo que puede deshabilitar o habilitar SwipeRefreshLayout, permítame dar un ejemplo

digamos que usa el administrador de disposición lineal o la cuadrícula, entonces puede averiguar la posición del reciclador desde allí

LinearLayoutManager mLayoutManager; if (mColumnCount <= 1) { mLayoutManager = new LinearLayoutManager(getBaseContext()); } else { mLayoutManager = new GridLayoutManager(getBaseContext(), mColumnCount); } recyclerAdapter = new RecyclerViewAdapter(allData); mRecycler.setAdapter(recyclerAdapter); mRecycler.setLayoutManager(layoutManager); if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) { swipeRefreshLayout.setEnabled(true); } else{ swipeRefreshLayout.setEnabled(false); }

para que su rollo de reciclador funcione bien y si llega a la cima, swipeRefreshLayout maneja el evento de actualización ...


Yo también estaba enfrentando el mismo problema. prueba esto:

guidesList.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int topRowVerticalPosition = (guidesList == null || guidesList.getChildCount() == 0) ? 0 : guidesList.getChildAt(0).getTop(); swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0); } });