SwipeRefreshLayout trigger programmatically

JavaAndroidSwiperefreshlayout

Java Problem Overview


Is there any way to trigger the SwipeRefreshLayout programmatically? The animation should start and the onRefresh method from the OnRefreshListener interface should get called.

Java Solutions


Solution 1 - Java

if you are using the new swipeRefreshLayout intoduced in 5.0 enter image description here

As the image shown above you just need to add the following line to trigger the swipe refresh layout programmatically

Work

in Java:

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

on in Kotlin:

mSwipeRefreshLayout.post { mSwipeRefreshLayout.isRefreshing = true }

NOT work

if you simply call in Java:

 mSwipeRefreshLayout.setRefreshing(true);

or in Kotlin

 mSwipeRefreshLayout.isRefreshing = true

it won't trigger the circle to animate, so by adding the above line u just make a delay in the UI thread so that it shows the circle animation inside the ui thread.

By calling mSwipeRefreshLayout.setRefreshing(true) the OnRefreshListener will NOT get executed

In order to stop the circular loading animation call mSwipeRefreshLayout.setRefreshing(false)

Solution 2 - Java

In order to trigger SwipeRefreshLayout I tried this solution:

SwipeRefreshLayout.OnRefreshListener swipeRefreshListner = new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Log.i(TAG, "onRefresh called from SwipeRefreshLayout");
            // This method performs the actual data-refresh operation.
            // The method calls setRefreshing(false) when it's finished.
            loadData();
        }
    };

Now key part:

swipeLayout.post(new Runnable() {
@Override public void run() {
     swipeLayout.setRefreshing(true);
     // directly call onRefresh() method 
     swipeRefreshListner.onRefresh();
   }
});

Solution 3 - Java

Bit late to the thread, but you do not need to launch a Runnable to do this. You can simply trigger the refresh and call your onRefresh method directly in onCreate, or wherever you want this to happen:

class MyFragment: SwipeRefreshLayout.OnRefreshListener {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initViews()
    }

    fun initViews() {
        swipe_refresh_layout?.apply {
            setOnRefreshListener(this@MyFragment)
            isRefreshing = true
            onRefresh()
        }
    }

    override fun onRefresh() {
        // Do my refresh logic here
    }
}

Solution 4 - Java

Simply create a SwipeRefreshLayout.OnRefreshListener and call its function onRefresh() whenever needed:

SwipeRefreshLayout srl;
SwipeRefreshLayout.OnRefreshListener refreshListener;

srl = (SwipeRefreshLayout)v.findViewById(R.id.swipeRefreshLayout);

refreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
      //Do your stuff here
    }
};
srl.setOnRefreshListener(refreshListener);

Now, whenever you want to call it manually, just call it through the listener

refreshListener.onRefresh();

Solution 5 - Java

binding.swipeRefreshLayout.setRefreshing(true); // show loading 
binding.swipeRefreshLayout.post(this::updateUI); // call method
binding.swipeRefreshLayout.setOnRefreshListener(this::updateUI); // call method

Solution 6 - Java

You can call onRefresh() method programmatically and then inside the method start the animation if it is not already started. See the following:

@Override
public void onRefresh() {
    if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
    //TODO
}

Solution 7 - Java

Just to force in add this two to ennable swipe gesture

swipeRefreshLayout.setOnRefreshListener(
    new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Log.i(TAG, "onRefresh called from SwipeRefreshLayout");

            // This method performs the actual data-refresh operation.
            // The method calls setRefreshing(false) when it's finished.
            FetchData();
        }
    }
);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNiklasView Question on Stackoverflow
Solution 1 - JavaRamzView Answer on Stackoverflow
Solution 2 - JavaMin2View Answer on Stackoverflow
Solution 3 - JavaIndianaView Answer on Stackoverflow
Solution 4 - JavaAman Raj SundramView Answer on Stackoverflow
Solution 5 - JavaAditya PratamaView Answer on Stackoverflow
Solution 6 - Javauser7010102View Answer on Stackoverflow
Solution 7 - JavaGoodlifeView Answer on Stackoverflow