在viewpager中替换片段不起作用

时间:2014-01-30 09:41:07

标签: android android-fragments android-viewpager fragmentstatepageradapter fragmentmanager

在我的项目中,我正在使用带有可滑动的三个片段的动作栏(带有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;
    }

}

n不确定我哪里出错。感谢任何帮助。

1 个答案:

答案 0 :(得分: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)中建议的实施方案。

我希望它有所帮助!