【问题标题】:Android - block swipe-to-refresh action while a refresh is in progressAndroid - 在刷新过程中阻止滑动刷新操作
【发布时间】:2018-05-29 13:15:23
【问题描述】:

我需要帮助解决一个错误。 我找了三天这个bug的解决方法,我解释一下情况:我想展示一些卡片,假设它们是10,我也为它们实现了一个计数器。它们是生成的,但是一旦我使用刷新操作(在很短的时间内多次),卡片的数量就会增加一倍(计数器 = 20,显示每张卡片的副本)。

我正在尝试实现android的刷卡刷新(pull-to-refresh)功能,我将它与包含卡片的recyclerview一起使用,除了当我启动时一切正常刷新动作,然后在刷新期间,它不会禁用刷新功能并且可以多次更新(取决于速度甚至3次)并且卡片的数量和相应的计数器增加一倍(或三倍)。 我尝试使用以下功能:

mSwipeRefreshLayout1.setEnabled(false);

这是我正在使用的代码:

mSwipeRefreshLayout1 = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
mSwipeRefreshLayout1.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mSwipeRefreshLayout1.setEnabled(false);
            refreshContent();
            mSwipeRefreshLayout1.setEnabled(true);
        }
    });

这是刷新功能:

/*** refresher action ***/
private void refreshContent(){
    cardList.clear();    // clear the card list
    count = 0;           // reset the counter
    // build cards and counter
    mSwipeRefreshLayout1.setRefreshing(false);
}

我也在尝试这个,但没有:

/*** refresher action ***/
private void refreshContent(){
    cardList.clear();    // clear the card list
    count = 0;           // reset the counter
    mSwipeRefreshLayout1.setEnabled(false);      //*
    // build cards and set counter
    mSwipeRefreshLayout1.setRefreshing(false);   
    mSwipeRefreshLayout1.setEnabled(true);       //*
}

因为如果我等待刷新(动画)动作正常工作,我需要在前一次刷新期间禁用刷新动作的东西,所以我不会遇到这个错误。谢谢。

编辑:

我也在尝试这个,但没有:

mSwipeRefreshLayout1.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            if (control){
                control = false;    // boolean 
                refreshContent();
                control = true;
            }
        }
    });

【问题讨论】:

  • 如果您只是加载同步方法,为什么还要集成 swipeRefresh/loading?还是您的卡数据列表来自 API 调用?
  • 我需要从数据库中读取数据,不是静态数据。
  • 好的,我已经添加了一个答案,我已经包含了关于如何在我的所有项目中处理滑动刷新布局的代码。 (实际上我几乎所有的项目都有刷卡刷新)。您只需要在滑动刷新时调用 post() 然后从那里调用 swipeRefreshLayout 的 setRefreshing() 方法
  • 你找到解决这个问题的方法了吗??

标签: android android-cardview pull-to-refresh swiperefreshlayout swipe-gesture


【解决方案1】:

您可以使用boolean isLoading 标志和回调进行简单修复。

void refresh() {
    if(!isLoading) {
        isLoading = true;
        loadYourData(() -> {
            isLoading = false;
        })
    }
}

现在当用户在刷新期间激活刷新时,没有任何反应。 不要忘记添加一些错误回调(如果需要)。

【讨论】:

  • 我也在 onRefresh() 方法中尝试过这个,但是没有用。
  • @mixx 您需要为数据加载添加回调(如果是异步的)if (control) { control = false; refreshContent(() -> { control = true; } );
【解决方案2】:

我多年来一直在使用这种方法:

mSwipeRefreshLayout1.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refreshContent();
        }
    });

还有你的refreshContent() 方法:

private void refreshContent() {
   mSwipeRefreshLayout1.post(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout1.setRefreshing(true);
            }
        });

  //call async method to load data....
}

在您收到数据后的回调中:

private void callback() {
    mSwipeRefreshLayout1.post(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout1.setRefreshing(false);
            }
        });

   //clear the view and load it again
}

【讨论】:

  • 感谢您的回复,这里“//清除视图并再次加载”我需要清除 var (cardList.clear(); count = 0;) 并加载数据,如“ //调用异步方法加载数据...."?我必须在哪里调用回调方法?
  • 您在加载数据时使用的是什么?异步任务?凌空抽射?改造?它们都有一个回调方法,它可以将数据返回给你,这就是我在这里谈论的回调。
  • "清除视图并重新加载"是的,这意味着您的:cardList.clear();计数 = 0;
  • 我正在使用 firebase db 工具,只有 void onDataChange(DataSnapshot dataSnapshot) (读取数据和创建卡片)和 void onCancelled(DatabaseError databaseError) (用于 db 错误)等方法,所有两个都在对 db 的查询。
  • 这就是我所说的回调。
猜你喜欢
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多