コンテンツビューとして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();
}
もちろん、更新が止まることはありません。ループを見てください。
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);
}
}
}
これはアニメーションを削除します:
mSwipeRefreshLayout.setRefreshing(false);
私の場合、私はしました
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
}
});
二回。次に、それはによって削除されません
mSwipeRefreshLayout.setRefreshing(false);
ページがロードされたときにアニメーションのロードを停止したい場合は、ページが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は、ページが正常に読み込まれたときに検索し、アニメーションを停止します。
UIスレッドでsetRefreshing(false)
を使用します。
これを試して:
Handler mHandler = new Handler();//In UI Thread
...
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
swipeLayout.setRefreshing(isRefreshing);
}
}, delayTime);
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
}
}
}
リスナーが設定されていることを確認してください。
mSwipeRefreshLayout = findViewById(R.id.swiperefresh);
mSwipeRefreshLayout.setOnRefreshListener(this); // Important
リスナーは好きではありません。 C#でコーディングしている場合は、そのパラダイムに従う必要があると思います。それらの1つはイベントです。 MvxSwipeRefreshLayoutには、Refreshというイベントがあります。そして、そのハンドラーでできることは、それを待つなど、時間がかかることを実行してから、Refreshingをfalseに設定することです。
private async void SwipeToRefreshControl_Refresh(object sender, EventArgs e)
{
await ...some stuff here...
(sender as MvxSwipeRefreshLayout).Refreshing = false;
}