如何在ViewPager中重新创建所有片段:

时间:2013-05-21 13:47:49

标签: android android-viewpager

我有这个问题,我有FragmentActivity ViewPagerViewPagerAdapter

在此ViewPager中,我有3个Fragments,其中每个TableLayout都包含一个2dArrayList,使用FragmentActivity以编程方式填充。

点击2dArrayList布局中的按钮,我会过滤Fragments中的数据,并且基本上需要使用新数据集重新创建所有3 onCreateView(运行{{ 1}}所有方法中的方法)。

所以我为这个按钮创建了一个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(); 正如这里建议的那样:

How to recreate fragment with viewpager intentionally?

在此方法结束时,我希望适配器重新创建所有Fragment,但任何片段中的onCreateView都不会运行。

任何人都可以建议我做错了什么。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:20)

对于那些仍然面临同样问题的人,当我有七个片段的viewpager时,我遇到了同样的问题。这些片段的默认值是从服务加载英语内容,但这里的问题是我想更改设置活动的语法,完成设置活动后我希望主活动中的viewpager刷新片段以匹配来自用户的语言选择并且如果用户在这里选择阿拉伯语,那么加载阿拉伯语内容我从第一个trr开始工作:D

<强> 1。你必须使用FragmentStatePagerAdapter *。

  1. mainActivity我覆盖了onResume并执行了以下操作

    if (!(mPagerAdapter == null)) {
    
            mPagerAdapter.notifyDataSetChanged();
    
    
        }
    
  2. 我在mPagerAdapter中删除了getItemPosition()并使其返回POSITION_NONE。

    @Override
        public int getItemPosition(Object object) {
    
            return POSITION_NONE;
        }
    
  3. 像魅力一样工作

答案 1 :(得分:9)

正如@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 :(得分:0)

在@Emil-adz解决方案中,我们可以前进一点,因为在我的案例中我们得到了片段列表_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;
    }
}

答案 3 :(得分:0)

getActivity.recreate()将重新创建活动,因此会重新创建所有片段