SwipeRefreshLayout trigger programmatically

前端 未结 7 2097
独厮守ぢ
独厮守ぢ 2020-12-04 16:40

Is there any way to trigger the SwipeRefreshLayout programmatically? The animation should start and the onRefresh method from the OnRefreshLi

相关标签:
7条回答
  • 2020-12-04 16:42

    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

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

    if you simply call

     mSwipeRefreshLayout.setRefreshing(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)

    0 讨论(0)
  • 2020-12-04 16:46

    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();
       }
    });
    
    0 讨论(0)
  • 2020-12-04 16:46

    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
    }
    
    0 讨论(0)
  • 2020-12-04 16:47

    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();
            }
        }
    );
    
    0 讨论(0)
  • 2020-12-04 16:51

    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
        }
    }
    
    0 讨论(0)
  • 2020-12-04 16:55
    binding.swipeRefreshLayout.setRefreshing(true); // show loading 
    binding.swipeRefreshLayout.post(this::updateUI); // call method
    binding.swipeRefreshLayout.setOnRefreshListener(this::updateUI); // call method
    
    0 讨论(0)
提交回复
热议问题