首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换ViewPager中另一个片段中的片段

替换ViewPager中另一个片段中的片段
EN

Stack Overflow用户
提问于 2013-10-15 01:42:35
回答 2查看 1.7K关注 0票数 0

我完全是Android编程的新手,我很难让它工作(我很接近,但我遗漏了一些重要的东西)。

我有一个名为PatientPagerActivity的活动,它翻页浏览患者信息的片段。在每个PatientFragment中,我都有一个按钮,当单击该按钮时,除了提供患者信息外,还会提供一些其他信息。因此,我计划在PatientPagerActivity中做的是用PatientWithMiscFragment (它包含患者信息和其他部分)替换PatientFragment。

activity_pager.xml文件:

代码语言:javascript
运行
复制
<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文件:

代码语言:javascript
运行
复制
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。然而,在我的情况下,这并没有发生。

请帮我找出哪里出了问题。

谢谢!

EN

Stack Overflow用户

发布于 2013-10-16 02:06:38

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

修改后的代码如下:

代码语言:javascript
运行
复制
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();
        }
    }

}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19365970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档