سؤال

I have a SwipeRefreshLayout being used inside of Fragments that are being displayed in activities. Swiping does perform the refresh, but after I pull down it goes right back up and there's no indicator of indeterminate progress (the animated progress bars). It just disappears but still calls onRefresh() when it's done. Here's my layouts…

Activity layout:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <ListView
            android:id="@+id/left_drawer"
            android:layout_width="@dimen/nav_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:dividerHeight="1px"
            android:background="@color/drawer_background_gray"
            android:clipToPadding="false"/>

</android.support.v4.widget.DrawerLayout>

Fragment layout:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <ListView
                android:id="@android:id/list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"/>

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

    <TextView
            android:id="@android:id/empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/empty_text_size"
            android:layout_gravity="center"
            android:gravity="center"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:textColor="@color/brand_green"/>

    <ProgressBar
            android:id="@android:id/progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminateOnly="true"
            android:visibility="gone"
            android:layout_gravity="center"/>

</FrameLayout>

Code to initialize the Fragment's layout:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, null);
        swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
        swipeLayout.setOnRefreshListener(this);
        swipeLayout.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);
        return view;
}

There's generally a 3 to 6 second delay while refreshing, enough that it's noticeable while watching the log. It should be visible, and it worked fine when I used the now deprecated ActionBar-PullToRefresh library. I've tried making SwipeRefreshLayout the root view of the Fragment layout, and I tried removing the empty text and progress view, and it continues to not work.

There's a few more steps that go into my actual code that I can't reveal as it's an app being designed for my company. But it's only for providing a similar base to many different fragments that do similar things, it shouldn't affect any functionality for this.

هل كانت مفيدة؟

المحلول 2

I discovered the issue is that my app uses translucent UI on Android 4.4, padding is set to the top of the list and bottom of the list so that it goes under the action bar and above the navigation bar. Since the ListView becomes a child of the SwipeRefreshLayout, the padding should be set to the SwipeRefreshLayout instead of the ListView like I had been before I switched to using SwipeRefreshLayout.

نصائح أخرى

I used this below approach and it worked for me without workarounds, even Fragments, after so many tries:

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

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

      ** content **

    </ScrollView>

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

AppCompat Library: com.android.support:appcompat-v7:21.0.3.

//to enable 
swipeRefreshLayout.post(new Runnable() {
@Override public void run() {
    swipeRefreshLayout.setRefreshing(true);
}});


//to disable 
swipeRefreshLayout.post(new Runnable() {
@Override public void run() {
    swipeRefreshLayout.setRefreshing(true);
}});

//IF ABOVE CODE DOESN'T WORK
//you might have made SwipeRefreshLayout as a root layout and it can be the source of bug
//so put SwipeRefreshLayout inside any ViewGroup like RelativeLayout, LinearLayout

Change swipeLayout.setColorScheme() to .setColorSchemeResources(# Your Colors Ids)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top