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

Возможно ли это? как сказано в названии

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

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

Ответ 1

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

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

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


ШАГ 1: СКАЧАТЬ поддержка android-поддержки v4 (Open Source) из github

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

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

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

ШАГ 3: КОД ОБНОВЛЕНИЯ используйте

  • mySwipeRefreshLayout вместо
  • SwipeRefreshLayout

ШАГ 4: ОБНОВЛЕНИЕ LAYOUT используйте

  • 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
    }

Ответ 2

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

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

Ответ 3

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

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

public class FixedRelativeLayout extends RelativeLayout {

    ...

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

}

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

Ответ 4

У меня тоже была такая же проблема. попробуйте следующее:

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

Ответ 5

Вы можете найти просмотр ресайклеров в настоящее время вверху и зная, что вы можете отключить или включить 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 обработает событие обновления...