SwipeRefreshLayout trigger programmatisch

Is er een manier om de SwipeRefreshLayoutprogrammatisch te activeren? De animatie zou moeten starten en de onRefresh-methode van de OnRefreshListener-interface zou moeten worden aangeroepen.


Antwoord 1, autoriteit 100%

als je de nieuwe swipeRefreshLayout gebruikt die is geïntroduceerd in 5.0 voer hier de afbeeldingsbeschrijving in

Zoals de afbeelding hierboven, hoeft u alleen maar de volgende regel toe te voegen om de swipe-vernieuwingslay-out programmatisch te activeren

Werk

in Java:

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

aan in Kotlin:

mSwipeRefreshLayout.post { mSwipeRefreshLayout.isRefreshing = true }

WERKT NIET

als je gewoon Java aanroept:

mSwipeRefreshLayout.setRefreshing(true);

of in Kotlin

mSwipeRefreshLayout.isRefreshing = true

het activeert de cirkel niet om te animeren, dus door de bovenstaande regel toe te voegen, maak je een vertraging in de UI-thread zodat de cirkelanimatie in de ui-thread wordt weergegeven.

Door mSwipeRefreshLayout.setRefreshing(true)aan te roepen, wordt de OnRefreshListenerNIET uitgevoerd

Om de cirkelvormige laadanimatie te stoppen, belt u mSwipeRefreshLayout.setRefreshing(false)


Antwoord 2, autoriteit 19%

Om SwipeRefreshLayout te activerenheb ik deze oplossing geprobeerd:

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();
        }
    };

Nubelangrijk onderdeel:

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

Antwoord 3

Beetje laat voor de discussie, maar je hoeft hiervoor geen Runnable te starten. U kunt eenvoudig de vernieuwing activeren en uw onRefresh-methode rechtstreeks in onCreate aanroepen, of waar u maar wilt:

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
    }
}

Other episodes