Фрагмент, помещенный в mFragment в FragementStateAdapter.class, управляется методом
void placeFragmentInViewHolder(@NonNull final FragmentViewHolder holder)
, который является частным пакетом, и у нас нет доступа, и в этом методе фрагмент добавляется в менеджер mFragment. с тегом "f" + holder.getItemId()
, который совпадает с "f" + position
.
scheduleViewAttach(fragment, container);
mFragmentManager.beginTransaction()
.add(fragment, "f" + holder.getItemId())
.setMaxLifecycle(fragment, STARTED)
.commitNow();
mFragmentMaxLifecycleEnforcer.updateFragmentMaxLifecycle(false);
. По этой причине мы можем переопределить метод onBindViewHolder
, пока будет отображаться фрейммент.
@Override
public void onBindViewHolder(@NonNull FragmentViewHolder holder, int position, @NonNull List<Object> payloads) {
super.onBindViewHolder(holder, position, payloads);
if (position == 0) {
String fragmentTag = "f" + holder.getItemId();
Log.v(TAG,"fragmentTag is : " + fragmentTag);
MyFragment fragment0 = (MyFragment) this.mFragmentManger.findFragmentByTag(fragmentTag);
if (fragment0 != null) {
Log.v(TAG,"onBindViewHolder updating fragment ...");
// do what ever you want to update the MyFragment
fragment0.update(payloads);
} else {
Log.v(TAG,"onBindViewHolder called, but fragment0 is null!");
}
}
}
В моем случае this.mFragmentManager
обналичивается через конструктор.
public MyFragmentStateAdapter(@NonNull Fragment fragment) {
super(fragment); // this calls the fragment.getChildFragmentManager().
this.mFragmentManger = fragment.getChildFragmentManager();
}
И createFragment()
это:
@NonNull
@Override
public Fragment createFragment(int position) {
if(position == 0){
if (this.fragment0 == null) {
this.fragment0 = MyFragment.getInstance();
}
return this.fragment0;
} else {
Log.v(TAG, "position " + position + " is called");
return null;
}
}
Наконец, вызовите обновление где-нибудь еще, чтобы вызвать обновление:
ViewPager2.getAdapter().notifyItemChanged(0, null);
// 0 is the fragment position of the fragment0 and null is payload.