Android - Viewpager和片段,方法不起作用

e_o*_*ori 6 android android-fragments android-viewpager android-fragmentactivity

我有ViewPager两个Fragments我实例化onCreateFragmentActivity.

private List<Fragment> fragments = new Vector<Fragment>();

fragments.add(Fragment.instantiate(this,Frag_1.class.getName()));
fragments.add(Fragment.instantiate(this,Frag_2.class.getName()));
    this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments);
    vPager = (ViewPager) super.findViewById(R.id.pager);
    vPager.setAdapter(vPagerAdapter);
Run Code Online (Sandbox Code Playgroud)

我的第二个Fragment有一个方法,我打电话来更新我的ListView- refreshList():

public class Frag_2 extends Fragment {

    private ListView list;
    private ArrayList<data> data;
    private boolean firstCreation=true;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setRetainInstance(false);
    }   

    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.layout, container, false);
        list = (ListView) view.findViewById(R.id.lst);
        //this.setRetainInstance(true);
        return view;
    }


    public void refreshList(ArrayList <data> data){
        if(data!=null){
            ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data);
            list.setAdapter(adapter);}
    }
}
Run Code Online (Sandbox Code Playgroud)

叫我的 FragmentActivity

//Something
Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1);
if (fr.getView() != null) {
    fr.refreshList(data);
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到我改变屏幕的方向.纠正我,如果我错了,但我正在寻找几个小时,我没有找到解决方案或一个很好的解释,FragmentActivity只创建一次并且Fragments附加到它但Fragments重新配置更改.现在,当方向改变时,我没有得到它View,onCreate所以当我尝试ViewFragment它返回它时返回null并且我的refreshList()方法没有被调用.我怎样才能解决这个问题?

e_o*_*ori 1

我这样解决了问题:在 FragmentActivity 的 onCreate 中

if(savedInstanceState!=null){
            frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName());
            frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName());
        }
        else{
            frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName());
            frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName());
        }
        fragments.add(frag1);
        fragments.add(frag2);


protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1);
        getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2);
    }
Run Code Online (Sandbox Code Playgroud)

也许这不是宇宙中最好的解决方案,但看起来它确实有效......