0

我绝对是Android编程的新手,我很难使其工作(我非常接近,但我错过了一些重要的东西)。替换ViewPager中另一个片段中的片段

我有一个名为PatientPagerActivity的活动,它通过病人信息的片段进行页面化。在每个PatientFragment中,我有一个按钮,点击后,除了患者信息外,还会提供一些其他信息。所以我打算在PatientPagerActivity中做的是用PatientWithMiscFragment替换PatientFragment(它具有患者信息和其他部分)。

的activity_pager.xml文件:

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/viewPager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

PatientPagerActivity文件:

public class PatientPagerActivity extends FragmentActivity 
implements PatientPagerActivityCallbacks { 
private ViewPager mViewPager; 
private List<Patient> mQuizProblemList; 

private int mCurrentIndex; 
private List<PatientFragment> mPatientFragmentList; 
private List<PatientWithMiscFragment> mPatientWithMiscFragmentList; 

private static final String EMPTY_TEXT = ""; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pager); 

    mViewPager = (ViewPager) findViewById(R.id.viewPager); 

    mPatientList = 
       PatientManager.getInstance(this).getPatients(); 

    FragmentManager fm = getSupportFragmentManager(); 
    mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) { 
     @Override 
     public int getCount() { 
      return mPatientList.size(); 
     } 

     @Override 
     public Fragment getItem(int location) { 
      Patient patient = mPatientList.get(location); 
      PatientFragment fragment = 
            PatientFragment.newInstance(patient); 
      PatientWithMiscFragment miscFragment = 
            PatientWithMiscFragment.newInstance(patient); 

      if(mPatientFragmentList== null) { 
       mPatientFragmentList = 
              new ArrayList<PatientFragment>(); 
      } 
      mPatientFragmentist.add(fragment); 

      if(mPatientWithMiscFragmentList == null) { 
       mPatientWithMiscFragmentList = 
             new ArrayList<PatientWithMiscFragment>(); 
      } 
      mPatientWithMiscFragmentList.add(miscFragment); 

      return fragment; 
     } 
    }); 

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int counter) { 
      setTitle("Patient: " + (counter + 1)); 
      mCurrentIndex = counter; 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
      hideMiscInformation(); 
     } 
    }); 

    long patientID = 
        getIntent().getLongExtra(PatientFragment.EXTRA_PATIENT_ID, -1); 
    for(int counter = 0; counter < mPatientList.size(); counter++) { 
     if(mPatientList.get(counter).getPatient().getID() == patientID) { 
      mViewPager.setCurrentItem(counter); 
      setTitle("Patient: " + (counter + 1)); 
      mCurrentIndex = counter; 
      break; 
     } 
    } 
} 

@Override 
public void onMiscSelected() { 
    if(findViewById(R.id.viewPager) != null) { 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

        //Find the current PatientInformation 
     Fragment oldFragment = mPatientFragmentList.get(mCurrentIndex); 
     //And Remove it 
     if(oldFragment != null) { 
      ft.remove(oldFragment); 
      ft.commit(); 
     } 
        //Notify the adapter that data set has changed. 
     notifyAdapterDataSetChanged(); 

     ft = fm.beginTransaction(); 
        //Replace it with the corresponding fragment that also has misc 
     ft.add(R.id.viewPager, 
          mPatientWithMiscFragmentList.get(mCurrentIndex)); 
     ft.commit();  
     notifyAdapterDataSetChanged(); 
    } 
} 

public void hideMiscInformation() { 
    if(findViewById(R.id.viewPager) != null) { 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 

     //Remove the misc information 
     Fragment oldMiscFragment = 
         fm.findFragmentById(R.id.viewPager);   
     if(oldMiscFragment != null) { 
      ft.remove(oldMiscFragment); 
      ft.commit(); 
     } 
        //Replace it with ONLY the patient information. 
        ft = fm.beginTransaction(); 
     ft.add(R.id.viewPager, mPatientFragmentList.get(mCurrentIndex)); 
     ft.commit(); 
     notifyAdapterDataSetChanged(); 
    } 
} 
    : 
    : 
} 

当用户感兴趣的各种信息,回调发生了PagerActivity和onMiscSelected()将取代带有PatientWithMiscFragment的PatientFragment。但是,在我的情况下,这没有发生。

请帮助我确定我要出错的地方。

谢谢!

回答

-1

你可以使用一个简单的“FrameLayout”来用你的碎片来扩充它。所以最新的片段将取代之前的片段。

here是一个例子

祝你好运!

+0

Reiksiel,你提示此作为viewpager XML:<?XML版本= “1.0” 编码= “UTF-8”> <机器人.support.v4.view.ViewPager的xmlns:机器人= “http://schemas.android.com/apk/res/android” \t \t机器人:ID = “@ + ID/viewPager” \t \t机器人:layout_width = “match_parent” \t \t android:layout_height =“match_parent”> \t \t \t <的FrameLayout机器人:ID = “@ + ID/PatientFragment” \t \t机器人:layout_width = “match_parent” \t \t机器人:layout_height = “match_parent”/> \t \t \t – user2808089

+0

这是如何使用framelayout。我可能是错的,但我认为FragmentStatePageAdapter管理所有的片段。并且这些片段由getItem(int位置)返回。 – user2808089

+0

对不起,我不清楚。 – Reiksiel

0

正如其他文章中所记录的,当您处理FragmentStatePageAdapter时,您需要注意以下事项: 1.在用新片段替换旧片段后,通知适配器底层数据已通过调用FragmentStatePageAdapter.notifyDataSetChanged()更改。 2.您需要重写getItemPosition()。在此方法中,如果位于特定位置的碎片未被更改,并且您返回POSITION_NONE,则会得到不正确的结果。

与变化的代码如下:

public class PatientPagerActivity extends FragmentActivity implements PatientPagerActivityCallbacks { 
    private ViewPager mViewPager; 
    private List<Patient> mPatientList; 

    private int mCurrentIndex; 
    private List<PatientFragment> mPatientFragmentList; 
    private List<PatientWithMiscFragment> mPatientWithMiscFragmentList; 

    private static final String EMPTY_TEXT = ""; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pager); 

     mViewPager = (ViewPager) findViewById(R.id.viewPager); 

     mPatientList = 
       PatientManager.getInstance(this).getPatients(); 

     FragmentManager fm = getSupportFragmentManager(); 
     mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) { 
      @Override 
      public int getCount() { 
       return mPatientList.size(); 
      } 

      @Override 
      public Fragment getItem(int location) { 
       Patient patient = mPatientList.get(location); 
       PatientFragment fragment = 
         PatientFragment.newInstance(patient); 
       PatientWithMiscFragment miscFragment = 
         PatientWithMiscFragment.newInstance(patient); 

       if(mPatientFragmentList== null) { 
        mPatientFragmentList = 
          new ArrayList<PatientFragment>(); 
       } 
       mPatientFragmentist.add(location, fragment); 

       if(mPatientWithMiscFragmentList == null) { 
        mPatientWithMiscFragmentList = 
          new ArrayList<PatientWithMiscFragment>(); 
       } 
       mPatientWithMiscFragmentList.add(location, miscFragment); 

       return fragment; 
      } 
      @Override 
      public int getItemPosition(Object object) { 
       PatientFragment fragment = (PatientFragment) object; 
       if(mPatientFragmentList.get(mCurrentIndex).getCurrentPatient() != null && 
        fragment.getCurrentPatient().getID(). 
         equals(mPatientFragmentList.get(
         mCurrentIndex).getCurrentPatient().getID())) { 
        return POSITION_NONE; 
       } else if(mPatientFragmentList.get(mCurrentIndex).getCurrentPatient() == null) { 
        return POSITION_NONE; 
       } else { 
        return POSITION_UNCHANGED; 
       } 

      } 
     }); 

     mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageSelected(int counter) { 
       setTitle("Patient: " + (counter + 1)); 
       mCurrentIndex = counter; 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
       hideMiscInformation(); 
      } 
     }); 

     long patientID = 
       getIntent().getLongExtra(PatientFragment.EXTRA_PATIENT_ID, -1); 
     for(int counter = 0; counter < mPatientList.size(); counter++) { 
      if(mPatientList.get(counter).getPatient().getID() == patientID) { 
       mViewPager.setCurrentItem(counter); 
       setTitle("Patient: " + (counter + 1)); 
       mCurrentIndex = counter; 
       break; 
      } 
     } 
    } 

    @Override 
    public void onMiscSelected() { 
     if(findViewById(R.id.viewPager) != null) { 
      FragmentManager fm = getSupportFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 

      //Find the current PatientInformation 
      Fragment oldFragment = mPatientFragmentList.get(mCurrentIndex); 
      //And Remove it 
      if(oldFragment != null) { 
       ft.remove(oldFragment); 
       ft.commit(); 
      } 


      ft = fm.beginTransaction(); 
      //Replace it with the corresponding fragment that also has misc 
      ft.add(R.id.viewPager, 
        mPatientWithMiscFragmentList.get(mCurrentIndex)); 
      ft.commit();  
      notifyAdapterDataSetChanged(); 
     } 
    } 

    public void hideMiscInformation() { 
     if(findViewById(R.id.viewPager) != null) { 
      FragmentManager fm = getSupportFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 

      //Remove the misc information 
      Fragment oldMiscFragment = 
        fm.findFragmentById(R.id.viewPager);   
      if(oldMiscFragment != null) { 
       ft.remove(oldMiscFragment); 
       ft.commit(); 
      } 
      //Replace it with ONLY the patient information. 
      ft = fm.beginTransaction(); 
      ft.add(R.id.viewPager, mPatientFragmentList.get(mCurrentIndex)); 
      ft.commit(); 
      notifyAdapterDataSetChanged(); 
     } 
    } 

}