首页 > 解决方案 > 如何在实现 swipeRefreshLayout 时防止用户滚动?

问题描述

在我的应用程序中,我有一个包含 20 - 30 个项目的回收站视图,并且我具有拉动刷新内容的功能,并且我想防止用户在刷新过程中滚动视图,因为如果用户与滚动联系在一起,regresh 正在进行中,但我真的不知道该怎么做:/

eRecyclerView = findViewById(R.id.recycler_view);
        RecyclerView.LayoutManager eLayoutManager = new GridLayoutManager(this, 2);
        eRecyclerView.setLayoutManager(eLayoutManager);

 swipeRefreshLayout = findViewById(R.id.refreshSecondLevel);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() { 
               loadNewContent();
               Handler delay = new Handler();
                delay.postDelayed(new Runnable() {
                    @Override
                    public void run() { 
                        swipeRefreshLayout.setRefreshing(false);
                    }
                }, 3000);

            }
        });

标签: androidandroid-recyclerviewrefreshpull-to-refresh

解决方案


你应该覆盖canScrollVertically你的方法RecyclerView.LayoutManager

public class ToggledScrollLayoutManager extends LinearLayoutManager {
    private boolean mIsScrollEnabled = true;

    public ToggledScrollLayoutManager(Context context) {
        super(context);
    }

    public void setScrollEnabled(boolean enabled) {
        this.mIsScrollEnabled = enabled;
    }

    @Override
    public boolean canScrollVertically() {
        return mIsScrollEnabled && super.canScrollVertically();
    }
}

然后在用户刷新页面时使用它:

recyclerView = findViewById(R.id.recyclerView);
ToggledScrollLayoutManager layoutManager = new ToggledScrollLayoutManager();
recyclerView.setLayoutManager(layoutManager);

swipeRefreshLayout = findViewById(R.id.refreshSecondLevel);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
        public void onRefresh() { 
            loadNewContent();
            layoutManager.setScrollEnabled(false);
            Handler delay = new Handler();
            delay.postDelayed(new Runnable() {
                @Override
                public void run() { 
                    swipeRefreshLayout.setRefreshing(false);
                    layoutManager.setScrollEnabled(true);
                }
            }, 3000);
        }
    }
});

推荐阅读