Подтвердить что ты не робот

Как воссоздать все фрагменты в 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 из любого из фрагментов никогда не запускается.

Может ли кто-нибудь предположить, что я делаю неправильно. любая помощь будет оценена.

4b9b3361

Ответ 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 *.

  1. mainActivity я переопределила onResume и сделала следующее

    if (!(mPagerAdapter == null)) {
    
            mPagerAdapter.notifyDataSetChanged();
    
    
        }
    
  2. 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;
    }
}