当前位置: 首页 > 知识库问答 >
问题:

SwipeRefreshLayout setRefreshing()最初不显示指示器

赫连卓
2023-03-14

我有一个非常简单的布局,但当我在我的片段的onActivityCreated()中调用set刷新(true)时,它最初不会显示。

它只在我拉刷新时显示。知道为什么它一开始没有显示吗?

片段xml:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        </RelativeLayout>


    </ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>

片段代码:

public static class LinkDetailsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {

    @InjectView(R.id.swipe_container)
    SwipeRefreshLayout mSwipeContainer;

    public static LinkDetailsFragment newInstance(String subreddit, String linkId) {
        Bundle args = new Bundle();
        args.putString(EXTRA_SUBREDDIT, subreddit);
        args.putString(EXTRA_LINK_ID, linkId);

        LinkDetailsFragment fragment = new LinkDetailsFragment();
        fragment.setArguments(args);

        return fragment;
    }

    public LinkDetailsFragment() {
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mSwipeContainer.setOnRefreshListener(this);
        mSwipeContainer.setColorScheme(android.R.color.holo_blue_bright,
                android.R.color.holo_green_light,
                android.R.color.holo_orange_light,
                android.R.color.holo_red_light);
        mSwipeContainer.setRefreshing(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_link_details, container, false);
        ButterKnife.inject(this, rootView);
        return rootView;
    }

    @Override
    public void onRefresh() {
        // refresh
    }
}

共有3个答案

匡凌
2023-03-14

我的解决方案是重写SwipeRefreshLayout:

public class MySwipeRefreshLayout extends SwipeRefreshLayout {

    private boolean mMeasured = false;
    private boolean mPreMeasureRefreshing = false;

    public MySwipeRefreshLayout(final Context context) {
        super(context);
    }

    public MySwipeRefreshLayout(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (!mMeasured) {
            mMeasured = true;
            setRefreshing(mPreMeasureRefreshing);
        }
    }

    @Override
    public void setRefreshing(final boolean refreshing) {
        if (mMeasured) {
            super.setRefreshing(refreshing);
        } else {
            mPreMeasureRefreshing = refreshing;
        }
    }
}
易宣
2023-03-14

这些是旧的解决办法

在早期版本的android上,这一点很有用。支持v4,但从21.0.0版开始,它不起作用,并且仍然存在于android中。支持v4:21.0.3于2014年12月10日至12日发布,这就是原因。

SwipeReFresLayout.on量()之前调用setReFresing(true)时,SwipeReFresLayout指示器不会出现

解决方法:

在SwipeRefreshLayout上调用setProgressViewOffset(),使布局的圆视图无效,从而导致SwipeRefreshLayout。立即调用onMeasure()。

mSwipeRefreshLayout.setProgressViewOffset(false, 0,
                (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);

更新更好的解决方法

因为当方向改变或手动设置动作栏大小时,动作栏可能会变薄。我们设置了从该视图顶部开始的像素偏移量,在成功滑动手势到当前动作栏大小后,进度微调器应该在该偏移量处重置。

TypedValue typed_value = new TypedValue();
getActivity().getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, typed_value, true);
mSwipeRefreshLayout.setProgressViewOffset(false, 0, getResources().getDimensionPixelSize(typed_value.resourceId));

更新日期:2014年11月20日

如果在视图启动后显示SwipeReFresLayout对您的应用程序不是很重要。您可以使用处理程序或任何您想要的东西将其发布到未来的某个时间。

作为一个例子。

handler.postDelayed(new Runnable() {

    @Override
    public void run() {
        mSwipeRefreshLayout.setRefreshing(true);
    }
}, 1000);

或者正如Volodymyr Baydalka的回答所提到的。

以下是android问题跟踪程序中的问题。请向上投票,向他们表明我们需要修复它。

锺离辰沛
2023-03-14

面临同样的问题。我的解决方案-

mSwipeRefreshLayout.post(new Runnable() {
    @Override
    public void run() {
        mSwipeRefreshLayout.setRefreshing(true);
    }
});
 类似资料:
  • 我无法显示抽屉指示灯。目前,我要么什么都没有,要么” 我使用: v4。小装置。抽屉布局 v7。应用程序。ActionBarDrawerToggle 但是android。应用程序。ActionBar(不支持7) 以下是代码片段:

  • 我的一个程序中的java类遇到了一个奇怪的问题。谢天谢地,我能够使用示例取自Oracle网站: https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/FrameDemoProject/src/c

  • 问题内容: 我正在寻找一种在响应式网站上创建幻灯片“显示更多”功能的方法,该功能在段落的 两行 之后会中断。 之前,我是通过静态网站来实现此目的的,方法是对容器应用设置的高度并使用,然后对容器的高度进行动画处理。 但是,由于具有响应能力,容器以不同的浏览器宽度压缩文本,因此文本可能会占用更多/更少的空间。每次按下该段落时,该段落上方也可能有不同的内容。因此,该设置可能无法完全覆盖两行。 因此,无论

  • 问题内容: 这是我的AngularJs指令。它原本希望在模板中显示div,但是在运行代码时却什么也没有显示。 这是HTML 这是AngularJS指令 这是演示 问题答案: 声明指令时,您使用了名称,但这是错误的。您应该使用,因为它将被转换为元素。 指令名称中的任何大写字母都将转换为连字符,因为元素中未使用大写字母。例如将翻译为。 正如其他人提到的,AngularJS使用以下标准化规则进行标准化:

  • 我已经为我的spring boot应用程序配置了测微计和prometheus,我可以在endpoint/执行器/prometheus处看到以下指标(使用计时器生成): 但当我在Grafana中运行其中一个查询(针对prometheus实例配置)时,我没有看到任何结果。 这需要任何配置吗?

  • 问题内容: 我正在尝试请求权限以获取用户的当前位置。 我的日志记录表明,在查询时,我的应用当前没有此权限,但是在不调用任何内容时,则显示。 我的Google地图代码(实现和)位于中。 我设法使该功能在该应用程序的其他“活动”中成功运行,这只是带有Google地图的功能。将其放在或中的方法中(它需要去的地方),该方法不起作用。 有任何想法吗?这与我的Activity的类()有关,还是与Google地