Android 替换ViewPager中另一个片段中的片段
我对Android编程完全陌生,我很难让它工作(我很接近,但我错过了一些重要的东西) 我有一个名为PatientPagerActivity的活动,它翻阅患者信息的片段。在每个PatientFragment中,我都有一个按钮,单击时,除了提供患者信息外,还会提供一些其他信息。所以我计划在PatientGravity中用PatientWithMiscFragment(包含患者信息和杂项部分)替换PatientFragment activity_pager.xml文件:Android 替换ViewPager中另一个片段中的片段,android,android-viewpager,fragment,fragmentstatepageradapter,Android,Android Viewpager,Fragment,Fragmentstatepageradapter,我对Android编程完全陌生,我很难让它工作(我很接近,但我错过了一些重要的东西) 我有一个名为PatientPagerActivity的活动,它翻阅患者信息的片段。在每个PatientFragment中,我都有一个按钮,单击时,除了提供患者信息外,还会提供一些其他信息。所以我计划在PatientGravity中用PatientWithMiscFragment(包含患者信息和杂项部分)替换PatientFragment activity_pager.xml文件: <android.sup
<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" />
PatientPGeractivity文件:
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();
}
}
:
:
}
公共类PatientGravity扩展了FragmentActivity
实现PatientPGeractivityCallbacks{
私有视图寻呼机mViewPager;
私有列表mQuizProblemList;
私人国际货币指数;
私有列表mPatientFragmentList;
私人名单与杂项碎片名单;
私有静态最终字符串为空_TEXT=“”;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pager);
mViewPager=(ViewPager)findViewById(R.id.ViewPager);
MPA患者名单=
PatientManager.getInstance(this.getPatients();
FragmentManager fm=getSupportFragmentManager();
mViewPager.setAdapter(新的FragmentStatePagerAdapter(fm){
@凌驾
public int getCount(){
返回mPatientList.size();
}
@凌驾
公共片段getItem(int位置){
Patient=mPatientList.get(位置);
PatientFragment片段=
PatientFragment.newInstance(患者);
PatientWithMiscFragment miscFragment=
PatientWithMiscFragment.newInstance(患者);
如果(mPatientFragmentList==null){
mPatientFragmentList=
新的ArrayList();
}
mPatientFragmentist.add(片段);
如果(mPatientWithMiscFragmentList==null){
MPAINTWITHMISCRAGMENTLIST=
新的ArrayList();
}
mpatientwithmiscsfragmentlist.add(miscsfragment);
返回片段;
}
});
mViewPager.setOnPageChangeListener(新的ViewPager.OnPageChangeListener(){
@凌驾
已选择页面上的公共无效(整型计数器){
设置标题(“患者:+(计数器+1));
mCurrentIndex=计数器;
}
@凌驾
已滚动页面上的公共void(int arg0、float arg1、int arg2){
}
@凌驾
公共无效onPageScrollStateChanged(int arg0){
隐藏信息();
}
});
长期耐心=
getIntent().getLongExtra(PatientFragment.EXTRA_PATIENT_ID,-1);
对于(int counter=0;counter
当用户对杂项信息感兴趣时,PageActivity会发生回调,onMiscSelected()会将PatientFragment替换为PatientWithMiscFragment。然而,就我而言,这并没有发生
请帮我找出哪里出了问题
谢谢大家! 您可以使用一个简单的“框架布局”将其与您的片段一起膨胀。因此,最新的片段将取代以前的片段
这就是一个例子
祝你好运 正如其他帖子所述,在处理FragmentStatePageAdapter时,您需要注意以下几点: 1.用新片段替换旧片段后,通过调用FragmentStatePageAdapter.notifyDataSetChanged()通知适配器基础数据已更改。 2.您需要重写getItemPosition()。在该方法中,如果位于特定位置的片段没有更改,并且如果返回位置\无,则会得到错误的结果 更改后的代码如下所示:
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();
}
}
}
公共类PatientGravity扩展了Fr