Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When switch fragment with SwipeRefreshLayout during refreshing, fragment freezes but actually still work

UPDATE: I thought it worked correctly. But after some test trouble still exists *sniff*

Then I made a simpler version to see what exactly happen and I get to know that the refreshing fragment which should have been detached still left there. Or exactly, the view of the old fragment left there, on top of the newer fragment. Since RecyclerView's background of my original app is not transparent, so It turned out what I said before.

END OF UPDATE


I have a MainActivity with layout like this:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent">      <!-- As the main content view, the view below consumes the entire          space available using match_parent in both dimensions. -->     <FrameLayout android:id="@+id/container" android:layout_width="match_parent"         android:layout_height="match_parent" />      <!-- android:layout_gravity="start" tells DrawerLayout to treat          this as a sliding drawer on the left side for left-to-right          languages and on the right side for right-to-left languages.          If you're not building against API 17 or higher, use          android:layout_gravity="left" instead. -->     <!-- The drawer is given a fixed width in dp and extends the full height of          the container. -->     <fragment android:id="@+id/navigation_drawer"         android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"         android:layout_gravity="start" tools:layout="@layout/fragment_navigation_drawer" />  </android.support.v4.widget.DrawerLayout> 

The fragment ContentView I use to fill @id/container is configured as:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/contentView" android:layout_width="match_parent" android:layout_height="match_parent">  <android.support.v7.widget.RecyclerView     android:id="@+id/tweet_list"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="@color/grey_300"/>  </android.support.v4.widget.SwipeRefreshLayout> 

And here is onCreateView() of ContentView

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,                          Bundle savedInstanceState) {     // Inflate the layout for this fragment     View inflatedView = inflater.inflate(R.layout.fragment_content, container, false);      mRecyclerView = (RecyclerView) inflatedView.findViewById(R.id.tweet_list);     mRecyclerView.setHasFixedSize(false);      mLinearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());     mRecyclerView.setLayoutManager(mLinearLayoutManager);      mTweetList = new ArrayList<Tweet>;     mAdapter = new TweetAdapter(mTweetList);     mRecyclerView.setAdapter(mAdapter);     mRecyclerView.setItemAnimator(new DefaultItemAnimator());      mSwipeRefreshLayout = (SwipeRefreshLayout) inflatedView.findViewById(R.id.contentView);     mSwipeRefreshLayout.setOnRefreshListener(         ...     );     return inflatedView; } 

Then in MainActivity I switch the content to display by switching different ContentView. All looks good except one thing: when I switch ContentView fragments DURING refreshing by navigation drawer, then content freezes. But actually all things work as usual except you cannot see it.

like image 342
zlm2012 Avatar asked Nov 21 '14 08:11

zlm2012


2 Answers

Well... After some struggling I eventually solved this problem by myself, in a tricky way...

I just need to add these in onPause() :

@Override public void onPause() {     super.onPause();     ...      if (mSwipeRefreshLayout!=null) {         mSwipeRefreshLayout.setRefreshing(false);         mSwipeRefreshLayout.destroyDrawingCache();         mSwipeRefreshLayout.clearAnimation();     } } 
like image 183
zlm2012 Avatar answered Sep 20 '22 07:09

zlm2012


This issue seems to still be occurring in appcompat 22.1.1. Wrapping the SwipeRefreshLayout inside a FrameLayout solved this for me

<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/contentView"     android:layout_width="match_parent"     android:layout_height="match_parent">      <android.support.v7.widget.RecyclerView         android:id="@+id/tweet_list"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:background="@color/grey_300" />  </android.support.v4.widget.SwipeRefreshLayout> </FrameLayout> 
like image 21
user1354603 Avatar answered Sep 20 '22 07:09

user1354603