0

在我的項目中,我正在使用可滑動的threefragments(選項卡與viewpager)的操作欄,我試圖用第四個片段替換其中一個片段,但我不能得到它..在viewpager中替換片段不工作

**Below is my code** 

    public class GetRideFragment extends Fragment implements ICustomDateTimeListener, SelectedLocationListener{ 

     public GetRideFragment() { 
     } 
     @Override public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 


      } 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

      View rootView = inflater.inflate(R.layout.fragment_getride, container, false); 

      return rootView; 
     } 


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

      fromac.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        /* Intent newintent = new Intent(getActivity(), AutoSearchActivity.class); 
        startActivity(newintent); 
        getActivity().overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);*/ 

        PlaceSearchFragment fh = new PlaceSearchFragment(); 
        FragmentManager fm = getFragmentManager(); 
        FragmentTransaction ft = fm.beginTransaction(); 
        ft.replace(R.id.fragcontainer, fh); 
        ft.addToBackStack("fh"); 
        ft.commit(); 

       } 
      }); 

下面是我的佈局

<?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:id="@+id/fragcontainer"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/fragcontainer" 
    > 
    <TextView 
     android:id="@+id/ridetitile" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Get a Ride" 
     android:layout_marginTop="20dp" 
     android:layout_marginLeft="10dp" 
     android:textColor="#33b5e5" 
     android:layout_gravity="center" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:layout_marginTop="20dp" 
    android:layout_marginRight="5dp" 
     android:layout_marginLeft="5dp" 
    android:background="@drawable/gray_btn_disabled_normal" > 
............... 
........... 

我adpater

public class TabsPagerAdapter extends FragmentStatePagerAdapter { 

    public TabsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int index) { 

     switch (index) { 
     case 0: 
      // Top Rated fragment activity 
      return new GetRideFragment(); 
     case 1: 
      // Games fragment activity 
      return new PostRideFragment(); 
     case 2: 
      // Movies fragment activity 
      return new SearchRidesFragment(); 
     } 

     return null; 
    } 
    @Override 
    public int getItemPosition(Object object){ 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return 3; 
    } 

} 

不知道我要去哪裏錯了。任何幫助表示讚賞。

+0

問題應該在適配器中。哪一個是你用的? –

+0

任何錯誤?如果隨後顯示您的logcat – MGDroid

+0

@ carlo.marinangeli IAM使用FragmentStatePagerAdapter ...更新我的問題與適配器請看看 – teekib

回答

0

我有同樣的問題。我經過大量搜索後找到了解決方案。我會在你的代碼中看到2個問題:(對不起,因爲我的英文不好)

1)更改適配器內的項目(連接到你的viewpager)給定的位置,你必須改變方法返回的項目public Fragment getItem(int index)並調用方法notifyDataSetChanged()通知適配器內容已更改。

2)FragmentStatePagerAdapter的實施包含基於位置的緩存,如果你調用notifyDataSetChanged()它甚至不改變,你返回PagerAdapter.POSITION_NONE(此頁報告的問題:)https://code.google.com/p/android/issues/detail?id=37990

什麼我建議你的是:

  • 使用FragmentPagerAdapter,實施正確的方法getItem(int index)(用正確的項目在給定的位置),getItemPosition(Object object)getItemId(int position)

  • 如果您想使用FragmentStatePagerAdapter,請考慮在上面我喜歡的問題(NewFragmentStatePagerAdapter)中提出的實施方案。

我希望它有幫助!

+0

蔭做的@Override \t公共片段的getItem(INT指數){ \t \t開關(指數){ \t \t case 0: if(index == 0){ return GetRideFragment.newInstance();其他{ return PlaceSearchFragment.newInstance(); } 我可以在上面看到新的片段,但是舊的片段仍然保留...可以ü告訴我應該在哪裏使用notifyDataSetChanged() – teekib

+0

每次您想更改適配器內的內容(或更好:每次內容發生變化,所以'getItem'準備好返回不同的片段 - >你替換一個片段),你必須調用'notifyDataSetChanged()'。以這種方式通知適配器它必須刷新。 –

+0

謝謝..但沒有人似乎在爲我工作.. – teekib