2016-05-12 58 views
1

我在我的活動(我它們之間進行瀏覽使用片段交易)兩個片段:Android的碎片兩次

  1. 科目
  2. 主題詳細名單 - 名單等級

主題片段佈局:

<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/refresher" 
    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.support.v4.widget.SwipeRefreshLayout> 

swipeRefreshLayout的偵聽器是活動。它觸發一個AsyncTask,它下載新數據,通知數據已更改的片段並隱藏swipeRefreshLayout。

的onPostExecute方法的問題的一部分:

... 

try { 
    formatData(); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

View refresher = findViewById(R.id.refresher); 
((SwipeRefreshLayout) refresher).setRefreshing(false); 

marksFragment.notifyUpdate(activity); 
subjectsFragment.notifyUpdate(activity); 

它正常工作,但不是在這種情況下:

  • 我拉來刷新數據
  • 我瀏覽到主題細節(使用 碎片交易)
  • setRefreshing方法在 碎片交易期間被調用

在這種情況下,主題片段只是掛在那裏,兩個片段都在活動中。

SubjectFragment的代碼:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    ((SwipeRefreshLayout) view.findViewById(R.id.refresher)).setOnRefreshListener((SwipeRefreshLayout.OnRefreshListener) activity); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.subjects_fragment, null); 
} 

setRefreshing(false)上refreshLayout和如何避免讓受試者片段兩次?

+0

你可以張貼烏爾第一片段的onCreate()? –

+0

@PhanDinhThai我更新了這個問題。 – cuddlecheek

回答

1

我發現了一個類似的問題,以便您的代碼,參考答案:

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

我使用程序兼容性-V7:23.3.0。這個答案適用於我:

這個問題似乎仍然發生在appcompat 22.1.1。包裝 FrameLayout中的SwipeRefreshLayout爲我解決了這個問題。

所以我的題目片段佈局是這樣的:

<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 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/refresher" 
     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.support.v4.widget.SwipeRefreshLayout> 
</FrameLayout> 
0

更改上stack overflow

public class YourFragment extends Fragment { 
    SwipeRefreshLayout swipeLayout; 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     String[] values = new String[] { "Android List View", 
       "Adapter implementation", 
       "Simple List View In Android", 
       "Create List View Android", 
       "Android Example", 
       "List View Source Code", 
       "List View Array Adapter", 
       "Android Example List View", 
       "Android List View", 
       "Adapter implementation", 
       "Simple List View In Android", 
       "Create List View Android", 
       "Android Example", 
       "List View Source Code", 
       "List View Array Adapter", 
       "Android Example List View", 
       "Android List View", 
       "Adapter implementation", 
       "Simple List View In Android", 
       "Create List View Android", 
       "Android Example", 
       "List View Source Code", 
       "List View Array Adapter", 
       "Android Example List View" 
     }; 

     final SwipeRefreshLayout swipeView = (SwipeRefreshLayout)view. findViewById(R.id.refresher); 

     swipeView.setEnabled(false); 
     ListView lView = (ListView) view.findViewById(R.id.your_list_view); 
     ArrayAdapter<String> adp = new ArrayAdapter<String>(view.getContext(), 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 
     lView.setAdapter(adp); 

     swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       swipeView.setRefreshing(true); 
       (new Handler()).postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         swipeView.setRefreshing(false); 

        } 
       }, 3000); 
      } 
     }); 

     lView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView absListView, int i) { 

      } 

      @Override 
      public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (firstVisibleItem == 0) 
        swipeView.setEnabled(true); 
       else 
        swipeView.setEnabled(false); 
      } 
     }); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.subjects_fragment, null); 
    } 


    } 
+0

謝謝,我一定會嘗試。但爲什麼要把聽衆從活動中移動到片段上呢? – cuddlecheek

+0

它沒有工作。它仍然造成同樣的問題。 – cuddlecheek

+0

cuddlecheek檢查答案..我編輯我的答案... –