23

我有这个问题,我有一个FragmentActivitywith aViewPager和 a ViewPagerAdapter

在这个 ViewPager 中,我有 3 个Fragments,每个都包含一个TableLayout使用2dArrayList.

FragmentActivity布局中单击一个按钮,我过滤数据,2dArrayList基本上需要Fragments用新数据集重新创建所有 3 个(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 重新创建片段?

在此方法结束时,因此我希望适配器重新创建所有Fragments,但onCreateView来自任何片段的 s 永远不会运行。

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

4

4 回答 4

24

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

1.你必须使用 FragmentStatePagerAdapter*

  1. mainActivity 我覆盖了onResume并做了以下

     if (!(mPagerAdapter == null)) {
    
             mPagerAdapter.notifyDataSetChanged();
    
    
         }
    
  2. 我覆盖了getItemPosition()inmPagerAdapter并使其返回 POSITION_NONE。

     @Override
         public int getItemPosition(Object object) {
    
             return POSITION_NONE;
         }
    

像魅力一样工作

于 2014-12-11T11:46:50.050 回答
12

正如@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;
}  
于 2013-05-28T13:52:43.927 回答
1

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

于 2019-03-15T06:34:33.537 回答
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;
    }
}
于 2015-06-20T17:46:31.423 回答