拯救碎片状态

时间:2013-11-28 08:20:58

标签: android listview android-listview android-fragments

我有一个包含5个片段的活动(表格)。在我的第3个片段中,我有一个列表视图和一个图像按钮,用于从手机的图库中获取图像并将其放入列表视图中。对于那件事我没有任何疑问。

此外,当我滑动到我的第2和第4个片段并返回到我的第3个片段时,附加的图像停留在第3个片段列表视图中。

但是,当我滑动到第1和第5个片段并返回到我的第3个片段时,我的第3个片段列表视图上的图像附加消失了。可能是什么问题呢?这是我的代码:

Fragment3:

public class Fragment3 extends Fragment implements OnClickListener {

    ListView lv;
    ArrayList<Uri> array_list = new ArrayList<Uri>();
    ArrayAdapter<Uri> array_adapter;

    final int RQS_LOADIMAGE = 0;

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

        View v = inflater.inflate(R.layout.frag3, container, false);

        ImageButton b = (ImageButton) v.findViewById(R.id.button_ai);
        b.setOnClickListener(this);

        array_adapter = new ArrayAdapter<Uri>(getActivity(), android.R.layout.simple_list_item_1, array_list);
        lv = (ListView) v.findViewById(R.id.list_ai);
        lv.setAdapter(array_adapter);

        return v;
    }

    @Override
    public void onClick(View arg0) {

        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, RQS_LOADIMAGE);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == RQS_LOADIMAGE) {

          if(resultCode == Form.RESULT_OK) {
            Uri imageUri = data.getData();
            array_list.add(imageUri);
            array_adapter.notifyDataSetChanged();
          }
      }
    }

}

ActivityForm:

public class Form extends FragmentActivity {

    ViewPager viewPager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);

        viewPager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager));

    }

    public class MyAdapter extends FragmentStatePagerAdapter {

        public MyAdapter (FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = null;

            if (i == 0)
            {
                fragment = new Fragment1();
            }
            if (i == 1)
            {
                fragment = new Fragment2();
            }
            if (i == 2)
            {
                fragment = new Fragment3();
            }
            if (i == 3)
            {
                fragment = new Fragment4();
            }
            if (i == 4)
            {
                fragment = new Fragment5();
            }
            return fragment;
        }

        @Override
        public int getCount() {
            return 5;
        }
    }

}

3 个答案:

答案 0 :(得分:2)

View Pager默认只保留3页左/右/右。

您必须在代码中添加以下行来更改它: -

pager.setOffscreenPageLimit(5);  //in your case, you have 5 fragments 

答案 1 :(得分:0)

Viepage只缓存3页:当前,左右。如果您的片段从该列表中删除,则稍后将重新创建。使用FragmentStatePagerAdapter,这可以解决您的问题。

答案 2 :(得分:0)

您可以覆盖onSaveInstanceState(Bundle)并在分发包中保存片段的状态。同样覆盖onViewCreated(View, Bundle)。它会将您保存的数据保存在捆绑包中,您可以使用它来恢复碎片状态。