2015-05-14 77 views
9

在我的應用程序我使用導航選項卡使用視圖尋呼機。我已經能夠成功地繪製使用代碼標籤張貼在:
如何更新列表,每當選項卡更改視圖尋呼機

https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip

在這裏,我都用了,以獲得導航tabs.Everything工作正常的滑動標籤和查看傳呼機,但名單不能當我移動到另一個選項卡時得到更新。 OnResume()被調用,即使對象列表變量也在調試時得到更新,但視覺列表沒有得到更新。

我在這裏的代碼的一些片段:

對於TAB1:這在我的情況是活動選項卡

@Override 
    public void onResume() { 
     super.onResume(); 

     if(!internetUtil.isConnectedToInternet(getActivity())){ 
      mSwipeRefreshLayout.setEnabled(false); 
     }else{ 
      mSwipeRefreshLayout.setEnabled(true); 
      new GetUsersFromServerTask().execute(); // Here i am making the network calls 
     } 
} 

在TAB2:這是存檔選項卡

@Override 
    public void onResume() { 
     super.onResume(); 
     new GetUsersArchivedFromServerTask().execute(); // Network calls 
    } 

在MainActivity:

public class MaterialTab extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.material_main_sample); 
     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager())); 
     PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs); 
     tabsStrip.setViewPager(viewPager); 
     tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       if(position == 0){ 
        ActiveFragment activeFragment = new ActiveFragment(); 
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
        ft.detach(activeFragment); 
        ft.attach(activeFragment); 
        ft.commit(); 
       } if(position == 1){ 
        ArchiveFragment archiveFragment = new ArchiveFragment(); 
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
        ft.detach(archiveFragment); 
        ft.attach(archiveFragment); 
        ft.commit(); 
       } 
      } 
     }); 
    } 
} 

另外的事情是,當我做SwipeRefresh然後將列表得到更新。我現在完全搞不懂這種行爲。當我滑動選項卡時,相同的方法被調用,並且列表沒有得到更新,但是當我正在執行SwipeRefresh時,它將得到更新。

這是活性片段:

public class ActiveFragment extends Fragment { 

public void updateFragment(){ 
     new GetUsersArchivedFromServerTask().execute(); 
    } 

public class GetUsersArchivedFromServerTask extends AsyncTask<User, Void, String> { 
     @Override 
     protected String doInBackground(Shipment... parmas) { 
      // Log.d(TAG, String.valueOf(shipmentDbHandler.getAllActiveShipments().size())); 
      _userList1 = userDbHandler.getAllActiveUserByToday(DateTimeUtil.getCurrentTime()); 
      return ""; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(String str) { 
      // Set the refresh Listener to false after the list has been loaded with new set of data 
      if (mSwipeRefreshLayout.isRefreshing()) { 
       mSwipeRefreshLayout.setRefreshing(false); 
      } 

      if(_userList1.size() == 0){ 
       ViewGroup parentOne = (ViewGroup) viewOne.getParent(); 
       if(parentOne != null){ 
        parentOne.removeView(viewOne); 
       } 
      } 

      if(_shipmentList1.size() > 0){ 
       mShipmentAdapter = new ShipmentAdapter(getActivity(),_userList1,1); 
       shipmentListView1.setAdapter(mShipmentAdapter); 
       setListViewHeightBasedOnChildren(shipmentListView1); 
       ViewGroup parentOne = (ViewGroup) viewOne.getParent(); 
       if(parentOne == null){ 
        mainLayoutOne.addView(viewOne); 
       } 

       mShipmentAdapter.notifyDataSetChanged(); 
      } 
      mSwipeRefreshLayout.setClickable(true); 
     } 
    } 
} 

回答

4

請使用FragmentStatePagerAdapter了點。

+0

在我的代碼ViewPagerAdapter同時擴展FragmentStatePagerAdapter .. – anand

+1

視圖尋呼機負荷側片段,這樣的onResume方法已經調用,所以當你刷到的片段,然後沒有的onResume再次調用 –

3

您的OnPageChangeListener正在擰碎碎片。每次選擇一個頁面時,您都會創建一個新的Fragment並始終添加它..您嘗試分離尚未附加的新Fragment。它完全搞砸了。您的SampleFragmentPagerAdapter將爲您處理這些碎片交易。所以只要刪除你的setOnPageChangeListener,一切都應該沒問題。

0

嘗試使用notifyDataChange或notifyall

1

在你的片段中使用它。

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser) { 
     // Do your code here 
    } 
} 

每當用戶看到該選項卡時,都會調用此方法。希望這會解決你的問題!

+0

謝謝爲了這。這是在我的應用程序中幫助我的唯一的東西! – user3079872

3

這裏是一個簡單而有效的解決方案。只需要像這樣替換setOnPageChangeListener,這裏我們在getSupportFragmentManager的幫助下訪問當前片段的實例,並調用相應的片段方法。

tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      Fragment currentFragment = getSupportFragmentManager() 
        .findFragmentByTag(
          "android:switcher:" + R.id.viewpager + ":" 
            + mViewPager.getCurrentItem()); 
      if (currentFragment instanceof ActiveFragment) { 
       ((ActiveFragment) currentFragment).updateFragment(); 
      } else if (currentFragment instanceof ArchiveFragment) { 
       ((ArchiveFragment) currentFragment).updateFragment(); 
      } 
     } 
    }); 

並在你的各自片段中放置updateFragment()方法。

public void updateFragment() { 
    Toast.makeText(getActivity(), "ActiveFragment", Toast.LENGTH_SHORT) 
      .show(); 
    // make updates over here 
    // new GetUsersArchivedFromServerTask().execute(); // Network calls 
} 

參考link

+0

我試過這種方法,但是其餘的元素給予空指針異常 – anand

+0

你是指「其餘元素」是什麼意思? – Chitrang

+0

其餘的元素意味着在佈局我swipeRefresh ..按鈕然後所有這些都給空指針異常 – anand

0

重寫setPrimaryItem()並在該位置調用片段的refresh()方法。每當viewPager中所選項目更改時,都會調用setPrimaryItem()。它可能被稱爲不止一次,所以你也必須處理它。 請參閱:setPrimaryItem

我希望這有助於。

2
  1. 刪除頁面變化listerner onPageSelected(...)代碼,無需attatch/detatch手動,ViewPager照顧這個自動。而且你的SampleFragmentPagerAdapter應該在getItem(...)中創建每個片段實例。

  2. new GetUsersFromServerTask().execute()應在每個片段的onCreateView中調用,然後在Asynctask完成後更新視圖。


此外,你應該是OffscreenPageLimit意識到:

公共無效setOffscreenPageLimit(INT限制)

設置應該保留,兩側的頁數視圖層次結構中的當前頁面處於空閒狀態。超出此限制的頁面將在需要時從適配器重新創建。

這是作爲優化提供的。如果您事先知道您需要支持的頁面數量或者在您的頁面上放置了延遲加載機制,那麼調整此設置可以在分頁動畫和交互的感知平滑度方面帶來好處。如果您有一小部分頁面(3-4)可以一次保持活動狀態,那麼隨着用戶來回翻頁,新創建的視圖子樹的佈局花費的時間會更少。

您應該保持低限,特別是如果您的頁面佈局複雜。此設置默認爲1

+0

我已經移除了片段的附加和分離,但是現在沒有方法在片段內調用。我認爲它正在緩存這些碎片。 – anand

+0

實際上'ViewPager'總是保持鄰居緩存,這意味着鄰居用當前片段調用togather。所以當你轉移到鄰居時,你看不到它正在更新,實際上它已經更新了。 – Xcihnegn

相關問題