11

是否可以 ??正如标题所说

向下滑动以刷新布局,但坚持布局而不是沿着滑动手势向下移动

谢谢 - 我正在使用 SwipeRefreshLayout

4

5 回答 5

23

你试试这个方法

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,则此代码不起作用

于 2014-09-30T10:40:14.963 回答
12

经过反复试验,我找到了一种解决方案

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

对于可以实现 SwipeRefreshLayout 的人,为了实现它


第 1 步:从 github下载android-support v4(开源)

第 2 步:将以下 java 类复制到您的项目 src

  • 滑动刷新布局
  • 滑动进度条
  • BakedBezierInterpolator

note1-(将 SwipeRefreshLayout 重构为 mySwipeRefreshLayout 以防止与原始混淆) note2-(修复这些类并使用彼此的源而不是 v4)

第 3 步:更新代码使用

  • mySwipeRefreshLayout而不是
  • 滑动刷新布局

第 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
    }
于 2014-04-28T15:04:57.210 回答
4

感谢Jongz Puangput的解决方法,但我想提出另一种解决方案,我觉得它更简单。

为了防止下拉 SwipeRefreshLayout 的子视图,您可以为自己的子视图提供覆盖offsetTopAndBottom方法,如下所示:

public class FixedRelativeLayout extends RelativeLayout {

    ...

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

}

这对我有用,希望它会帮助任何人。

于 2014-08-06T09:10:33.200 回答
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);
    }
});
于 2015-04-09T11:33:03.823 回答
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 处理刷新事件......

于 2016-04-21T14:21:14.523 回答