Как воссоздать все фрагменты в ViewPager:
У меня есть эта проблема, у меня есть FragmentActivity
с ViewPager
и ViewPagerAdapter
.
В этом ViewPager у меня есть 3 Fragments
, каждый из которых содержит TableLayout
, который программно заполняется с помощью 2dArrayList
.
одним нажатием кнопки в макете FragmentActivity
, я фильтрую данные в 2dArrayList
и в основном нужно воссоздать все 3 Fragments
с новым набором данных (запустите метод onCreateView
во всех них).
Итак, я создаю onClickListener
для этой кнопки:
private class SlicerSelectedOnClickListener implements OnClickListener {
private ODSharedSlicer slicer;
public SlicerSelectedOnClickListener(ODSharedSlicer slicer) {
super();
this.slicer = slicer;
}
public void onClick(View v) {
String slicerValue = ((Button) v).getText().toString();
Log.d(TAG,"Slicer value: "+ slicerValue +" chosen");
application.currentReport.getODSharedSlicers().get(0).getSharedSlicerSelectedMemebers().add(slicerValue);
ViewGroup parent = (ViewGroup) ((Button) v).getParent();
for (int i = 0; i < parent.getChildCount(); i++)
{
if ((parent.getChildAt(i) != v) && (parent.getChildAt(i) instanceof ToggleButton))
{
((ToggleButton) parent.getChildAt(i)).setChecked(false);
}
}
mPagerAdapter.notifyDataSetChanged();
}
}
Как вы можете видеть, у меня есть mPagerAdapter.notifyDataSetChanged();
Как предлагается здесь:
Как воссоздать фрагмент с помощью viewpager намеренно?
в конце этого метода. Поэтому я ожидаю, что адаптер воссоздает все Fragment
s, но onCreateView
из любого из фрагментов никогда не запускается.
Может ли кто-нибудь предположить, что я делаю неправильно.
любая помощь будет оценена.
Ответы
Ответ 1
Как было предложено здесь @Luksprog, меняем класс адаптера следующим образом:
public class ViewPagerAdapter extends FragmentPagerAdapter
{
private List<Fragment> fragments;
/**
* @param fm
* @param fragments
*/
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
Исправлена ошибка.
что я сделал, это добавить этот метод:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Ответ 2
для тех, кто по-прежнему сталкивается с той же проблемой, с которой я столкнулся с той же проблемой, когда у меня есть viewpager с семью фрагментами. по умолчанию эти фрагменты загружают английский контент из службы, но проблема здесь в том, что я хочу изменить langage из настройки активности и после завершения настроек настройки. Я хочу, чтобы viewpager в основной активности обновлял фрагмент, чтобы соответствовать выбору langauge от пользователя и загрузите арабский контент, если пользователь выбирает арабский язык здесь, что я сделал для работы из первого trr: D
1. вы должны использовать FragmentStatePagerAdapter *.
-
mainActivity я переопределила onResume и сделала следующее
if (!(mPagerAdapter == null)) {
mPagerAdapter.notifyDataSetChanged();
}
-
i ovveride getItemPosition() в mPagerAdapter и вернуть его POSITION_NONE.
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
работает как шарм
Ответ 3
в решении @Emil-adz мы можем пойти немного впереди, потому что в моем случае мы получили фрагмент listy, называемый _fragments, который мы можем вернуть в виде фрагмента так:
@Override
public int getItemPosition(Object object) {
/** check if object is fragment class */
if (object.getClass().isAssignableFrom(Fragment.class)) {
/** cast object to fragment */
Fragment customFragment = (Fragment)object;
/** return fragment position from our list */
return _fragments.indexOf(customFragment);
} else {
/** else re-create */
return POSITION_NONE;
}
}