SwipeRefreshLayout - 向下滑动以刷新但不移动视图下拉

时间:2014-04-28 12:54:15

标签: android android-layout swiperefreshlayout

有可能吗?正如标题所说

向下滑动以刷新布局,但坚持布局不要沿着滑动gusture向下移动

谢谢 - 我正在使用SwipeRefreshLayout

5 个答案:

答案 0 :(得分: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

,则此代码不起作用

答案 1 :(得分:12)

在我的反复试验之后,我找到了一个

的解决方案

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

对于可以实现SwipeRefreshLayout的人来说,实现它


第1步:下载来自github的android-support v4(开源)

第2步: COPY 跟随项目src的

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

note1-(重构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
    }

答案 2 :(得分:4)

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

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

public class FixedRelativeLayout extends RelativeLayout {

    ...

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

}

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

答案 3 :(得分: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);
    }
});

答案 4 :(得分: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处理刷新事件...