0

Я абсолютно не знаком с Android-программированием, и у меня возникают трудности с его работой (я довольно близок, но мне не хватает чего-то важного).Замена фрагмента в другом фрагменте в ViewPager

У меня есть деятельность под названием PatientPagerActivity, которая просматривается через фрагменты информации о пациентах. В каждом PatientFragment у меня есть кнопка, при нажатии которой будет предоставлена ​​помимо информации о пациенте другая информация. Итак, что я планировал сделать в PatientPagerActivity, нужно было заменить PatientFragment PatientWithMiscFragment (у этого есть информация о пациенте и разная часть).

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() заменит PatientFragment с PatientWithMiscFragment. Однако в моем случае этого не происходит.

Пожалуйста, помогите мне определить, в чем я ошибаюсь.

Спасибо!

ответ

-1

Вы можете использовать простой «FrameLayout», чтобы раздуть его своим фрагментом. Таким образом, новый фрагмент заменит предыдущий.

here является примером

Успехов!

+0

Reiksiel, ты предлагаешь это как ViewPager XML: <андроида .support.v4.view.ViewPager XMLNS: андроид = "http://schemas.android.com/apk/res/android" \t \t андроид: идентификатор = "@ + идентификатор/ViewPager" \t \t андроида: layout_width = "match_parent" \t \t android: layout_height = "match_parent"> \t \t \t \t \t \t – user2808089

+0

И как используется этот режим каретки. Возможно, я ошибаюсь, но я думал, что FragmentStatePageAdapter управляет всеми фрагментами.И эти фрагменты возвращаются getItem (int location). – 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(); 
     } 
    } 

} 
Смежные вопросы