web-dev-qa-db-ja.com

SwipeRefreshLayout更新アニメーションが停止しない

コンテンツビューとしてSwipeRefreshLayoutを持つフラグメントを実装しました。リフレッシュアニメーションはonRefreshでトリガーされますが、サーバーからデータを取得した後にsetRefreshingがfalseに設定されていても停止しません。

    @Override
public void onRefresh() {
    handler.post(refreshing);
}


private final Runnable refreshing = new Runnable(){
    public void run(){
        try {
            if(isRefreshing()){
                handler.postDelayed(this, 1000);
            }else{
                swipeLayout.setRefreshing(false);
                mainActivity.forceUpdate();
                setLayout();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
};

private boolean isRefreshing(){
    return swipeLayout.isRefreshing();
}
8
blavi

もちろん、更新が止まることはありません。ループを見てください。

if(isRefreshing()){
    handler.postDelayed(this, 1000);
}else{
    swipeLayout.setRefreshing(false);
    mainActivity.forceUpdate();
    setLayout();
}

基本的に、「swipeLayout.setRefreshing(false);」を停止することはありません。必要な条件は(isRefreshing())がfalseであるため意味がないため、呼び出されることはありません。停止するように指示することはないため、常に「isRefreshing()」からtrue値を取得します。 。 isRefreshingのブール値に基づくfalseへのsetRefreshingは間違っていると私は思います。これに依存するべきではありません。リフレッシュ状態をいつ停止するかを決めるのはあなたです。

通常、PullToRefreshはサーバーから新しいデータを取得するために使用されます。だから基本的に私はあなたがあなたのサーバーから答えを得るところにこのチェックを挿入することを勧めます:

if (swipeLayout.isRefreshing()) {
     swipeLayout.setRefreshing(false);
}

サーバーから新しいデータを取得すると、更新を停止する必要があるためです。

編集-完全なコード例を追加

protected SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        retrieveDocuments();
    }
};

public void retrieveDocuments() {
//some code, server call

//onCompletion is your server response with a success
@Override
public void onCompletion(String result) {

    if (mSwipeRefreshLayout.isRefreshing()) {
       mSwipeRefreshLayout.setRefreshing(false);
    }
}

}
22
JozeRi

これはアニメーションを削除します:

mSwipeRefreshLayout.setRefreshing(false);
9

私の場合、私はしました

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

二回。次に、それはによって削除されません

mSwipeRefreshLayout.setRefreshing(false);
3
iftach barshem

ページがロードされたときにアニメーションのロードを停止したい場合は、ページがWebviewに完全にロードされたときに最初にそれを見つける必要があります。

Webviewにページをロードし、ページの完全なロード後にアニメーションのロードを停止するための完全なコードを次に示します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web_view);


    final WebView wvSocialMediaPage = findViewById(R.id.wv_social_media_page);
    wvSocialMediaPage.setWebViewClient(new CustomWebViewClient());
    WebSettings webSetting = wvSocialMediaPage.getSettings();
    webSetting.setJavaScriptEnabled(true);
    webSetting.setDisplayZoomControls(true);
    wvSocialMediaPage.loadUrl("https://facebook.com");

    swipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe_container);
    swipeRefreshLayout.setOnRefreshListener(
            new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    wvSocialMediaPage.reload();
                }
            }
    );
}



    private class CustomWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        swipeRefreshLayout.setRefreshing(false);
    }
}

onPageFinishedは、ページが正常に読み込まれたときに検索し、アニメーションを停止します。

3
Ehsan Rafique

UIスレッドでsetRefreshing(false)を使用します。

これを試して:

Handler mHandler = new Handler();//In UI Thread

...

mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        swipeLayout.setRefreshing(isRefreshing);
    }
}, delayTime);
2
user4470672

Kotlinを使用している場合は、コルーチンを使用してこれを行うことができます。

どこ binding.dashboardRefreshは私のSwipeRefreshLayoutです。

    //Refresh the info on Swipe-Refresh
    binding.dashboardRefresh.run {
        setOnRefreshListener {
            menuViewModel.getFields()
            val workerScope = CoroutineScope(Dispatchers.IO)
            workerScope.launch {
                delay(3000)
                isRefreshing = false
            }
        }
    }
0
Felix Favour

リスナーが設定されていることを確認してください。

mSwipeRefreshLayout = findViewById(R.id.swiperefresh);
mSwipeRefreshLayout.setOnRefreshListener(this); // Important
0
Rejinderi

リスナーは好きではありません。 C#でコーディングしている場合は、そのパラダイムに従う必要があると思います。それらの1つはイベントです。 MvxSwipeRefreshLayoutには、Refreshというイベントがあります。そして、そのハンドラーでできることは、それを待つなど、時間がかかることを実行してから、Refreshingをfalseに設定することです。

    private async void SwipeToRefreshControl_Refresh(object sender, EventArgs e)
    {
        await ...some stuff here...
        (sender as MvxSwipeRefreshLayout).Refreshing = false;
    }
0