Intereting Posts
Определение максимального / минимального размера текстуры в Android OpenGLES Панель инструментов выравнивает название в центре с помощью кнопки «Назад» Android автоматически перемещает содержимое EditText на следующую строку при наборе текста Каков правильный способ справиться с изменением ориентации, когда пользовательский alertdialog имеет открытый счетчик? Как просмотреть Android ListView с настраиваемой строкой и заголовком Метод Gradle DSL не найден: 'apt ()' Преобразовать значения секунд в часовые минуты? Поиск предложений с сетевого ресурса в поле быстрого поиска Как включить проверку линзы Android для аннотации @Nullable? Дизайн Android EditText, чтобы отобразить сообщение об ошибке, как описано в Google Как получить файл .apk приложения программным путем Android: передача объектов между фрагментами Как я могу создать прямоугольник с двумя изогнутыми сторонами в XML-чертеже? AdMob: Отсутствует требуемый атрибут XML adUnitID Смещение / перемещение вкладки в сочетании с ScrollView?

SwipeRefreshLayout – проведите пальцем вниз, чтобы обновить, но не сдвинуть вид вниз

Является ли это возможным ?? Как сказано в названии

Проведите пальцем вниз, чтобы обновить макет, но придерживайтесь макета, а не перемещайте его вниз по губам

Спасибо – я использую SwipeRefreshLayout

Solutions Collecting From Web of "SwipeRefreshLayout – проведите пальцем вниз, чтобы обновить, но не сдвинуть вид вниз"

Вы пробуйте этот путь

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); }}); 

Этот код не работает, если listView имеет paddingTop

После проб и ошибок я нашел одно решение из

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

Для людей, которые могут реализовать SwipeRefreshLayout, чтобы достичь этого


ШАГ 1: СКАЧАТЬ android-support v4 (Open Source) из github

  • Android-support v4 – Скачать ссылку

ШАГ 2: КОПИРОВАТЬ следующий класс java для вашего проекта src

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

Note1- (Refactor SwipeRefreshLayout для mySwipeRefreshLayout, чтобы предотвратить путаницу с оригиналом) note2- (исправить эти классы и использовать источник друг от друга вместо v4)

ШАГ 3: ОБНОВЛЕНИЕ КОДА

  • MySwipeRefreshLayout вместо
  • SwipeRefreshLayout

ШАГ 4: ОБНОВЛЕНИЕ ПРОГРАММЫ

  • Com.yourpackage.mySwipeRefreshLaout вместо
  • android.support.v4.widget.SwipeRefreshLayout

ШАГ 5: В mySwipeRefreshLayout.java найдите и измените следующий код

 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 } 

Благодаря Jongz Puangput для обходного пути, но я хочу предложить другое решение, которое я считаю более простым.

Чтобы предотвратить выпадение дочернего элемента SwipeRefreshLayout, вы можете предоставить собственное дочернее представление с offsetTopAndBottom метода overrideendTopAndBottom следующим образом:

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

Это работает для меня, надеюсь, что это поможет кому угодно.

Я тоже столкнулся с такой же проблемой. попробуй это:

 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); } }); 

Вы можете узнать, как выглядит ресайлер в верхней части страницы, и, зная, что вы можете отключить или включить SwipeRefreshLayout, позвольте мне привести пример

Допустим, вы используете линейный менеджер компоновки или сетку, тогда вы можете узнать местоположение ресайклера оттуда

  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); } 

Поэтому прокрутка вашего ресайклера будет работать нормально, и если вы достигнете вершины, swipeRefreshLayout обработает событие обновления …