【问题标题】:SwipeRefreshLayout in API 21API 21 中的 SwipeRefreshLayout
【发布时间】:2014-10-28 05:00:24
【问题描述】:

我之前使用的是 API 19,并且在我的许多片段中都使用了 SwipeRefreshLayout。之前我第一次加载内容时,我使用的是setRefreshing(true);,并且能够加载内容并且效果很好。

我注意到在 Android 5.0 中,Google 正在使用循环进度视图。当我现在打电话给setRefreshing(true); 时,它根本没有效果。无论如何以编程方式显示新的微调器?我已经深入研究了这一点,但无法以编程方式显示它。我已经阅读了以下内容:

http://developer.android.com/tools/support-library/index.html

https://yassirh.com/2014/05/how-to-use-swiperefreshlayout-the-right-way/

SwipeRefreshLayout doesn't show any indicator of refreshing

基本上,它在第一次尝试时没有显示刷新的迹象。

【问题讨论】:

    标签: android swiperefreshlayout


    【解决方案1】:

    而不是直接设置

    getSwipeRefreshLayout().setRefreshing(true);
    

    您可以在 UI 线程上延迟它以供以后使用

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

    这非常适合我开始在 onCreateView 中加载,如果也在 LoaderManager.LoaderCallbacks 中完成。

    我没有看到进度条不小心卡住了(因为数据加载太快了),但是如果您怀疑加载可能会过早返回(错误?)值得做同样的发布强>为

    getSwipeRefreshLayout().setRefreshing(false);
    

    这样两个posts肯定会一个接一个地出现,导致一个绝对隐藏的进度视图。

    【讨论】:

    【解决方案2】:

    这不是一个非常干净的解决方案,但它现在可以工作。 setRefreshing(boolean) 进度视图位于操作栏后面。解决办法就是往下推:

        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int height = size.y;
        getSwipeRefreshLayout().setProgressViewOffset(false, -200, height / 9);
    

    如果您有更好的解决方案,请在下方发布,我会接受!

    请不要使用此解决方案,接受的答案更好。

    【讨论】:

    • 这是一场灾难。有很多更好的方法来实际修复这个错误,而不是一起破解东西。投反对票。
    • 请阅读问题以及我何时发布答案。当时SwipeRefreshLayout 是全新的,对此没有好的解决方案。
    【解决方案3】:

    我遇到了同样的问题,但仅在使用StickyListHeadersListView的情况下。 使用android.widget.ListView,一切正常。

    我认为在 api 21 中,Google 已经重写了 Listview 类。 如果您使用 Listview 子类,我想您可能需要在 api 21 中创建 subclass exends android.widget.ListView

    【讨论】:

    • 这很奇怪。我在所有地方都使用android.widget.ListView 或其子类...
    【解决方案4】:

    您要记住的是,Material Design SwipeRefreshLayout 发生了变化,而旧的使用了 BakedBezierInterpolator,而新的使用了“拖入位置”进度微调器

    不幸的是,API 21 不再包含 BakedBezierInterpolator,所以从我的角度来看,您有 2 个选项: 1)将微调器向下移动(并记住之后将其重新向上移动) 2) 当你最初加载数据时,让你自己的微调器坐在屏幕上

    如果你想让你的微调器保持不变,那么一定要使用 SwipeRefreshLayout 之一,但请确保你记得重新定位它

    我希望这在某种程度上有所帮助......

    【讨论】:

      【解决方案5】:

      你可以尝试在setRefreshing(true)之前调用measure(int, int)方法

      看看https://stackoverflow.com/a/26692841/2114930

      【讨论】:

        【解决方案6】:

        KVISH,请查看我的回答: SwipeRefreshLayout doesn't show any indicator of refreshing

        方法是将您的视图添加到 ScrollView 小部件中。如果您使用 AppCompat Library v21.0.3,它应该可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-05
          • 2018-09-24
          • 1970-01-01
          • 2015-10-23
          • 2018-06-24
          • 1970-01-01
          相关资源
          最近更新 更多