Question

J'essaie de créer un fragment contenant une vue en grille pour une interface utilisateur agréable. J'ai utilisé une partie de l'exemple de code pour essayer de créer ceci.

Ai-je vraiment besoin de garder une trace et d'enregistrer l'état de mes fragments pour les changements d'orientation (apparemment je le fais) ou est-ce que je manque quelque chose? D'après le son (il s'agit de la documentation FragmentPagerAdapter), il semble que le FragmentPagerAdapter enregistre tous les états pour moi ...

Qu'il suffise de dire, voici mon problème (j'ai 4 fragments avec quelques vues de texte en eux):

1. Lorsque j'incline l'écran sur Fragment0, les données sous-jacentes disparaissent et ne réapparaissent pas tant que je ne passe pas à Fragment2.

2. Lorsque j'incline l'écran sur Fragment1, les données sous-jacentes de celui-ci AND Fragment0 disparaissent et les données de Fragment1 ne réapparaissent pas jusqu'à ce que j'aille dans Fragment3 MAIS les données de Fragment0 réapparaissent lorsque je vais à Fragment2 (juste comme le cas 1 ci-dessus).

3. Lorsque j'incline l'écran sur Fragment2, les données sous-jacentes de celui-ci ET Fragment1 disparaissent et Fragment1 réapparaît si je vais à Fragment3 et Fragment2 réapparaîtra si je vais à Fragment0.

4. Lorsque j'incline le Fragment3, seul le Fragment2 disparaît.

Je fais évidemment quelque chose de mal, voici mon code:

Voici mon onCreate (ou une partie au moins):

mAdapter = new FragPagerAdapter(getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

Voici mon FragmentPagerAdapter :

private class FragPagerAdapter extends FragmentPagerAdapter {


            public FragPagerAdapter(FragmentManager fm) {
                            super(fm);

            }

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

            @Override
            public Fragment getItem(int position) {

                return ArrayFragment.newInstance(position, mItem2.get(position));

            }

}

Voici mon Fragment (avec mon ArrayAdapter):

public static class ArrayFragment extends Fragment {

    int mNum;
    private ArrayList<Item> mItems;
    private GridAdapter myGridAdapter;
    private static GridView mGridView;

    static ArrayFragment newInstance(int num, ArrayList<Item> items) {
        ArrayFragment f = new ArrayFragment();

        Bundle args = new Bundle();
        args.putInt("num", num);
        args.putSerializable("items", items);
        f.setArguments(args);

        return f;
    }


    @SuppressWarnings("unchecked")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
        mItems = (ArrayList<Item>) (getArguments() != null ? getArguments().getSerializable("items") : null);
        myGridAdapter = new GridAdapter(getActivity().getApplicationContext(), R.layout.grid_item, mItems);

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        //View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        View v = inflater.inflate(R.layout.grid, container, false);
        View tv = v.findViewById(R.id.text);
        ((TextView)tv).setText("Fragment #" + mNum);

        mGridView = (GridView) v.findViewById(R.id.gridview);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public void onStart()
    {
        super.onStart();
        mGridView.setAdapter(myGridAdapter); 
        mGridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                Toast.makeText(getActivity(), mItems.get(arg2).getSecret(), Toast.LENGTH_LONG).show();                  
            }

        });
    }


    public class GridAdapter extends ArrayAdapter<Item> {
        private int count;
        private LayoutInflater inflater;
        private Context context;
        private ArrayList<Item> items;

        public GridAdapter(Context context, int resource,
                ArrayList<Item> items_) {
            super(context, resource);
            count = items_.size();
            items = items_;

            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            // TODO Auto-generated constructor stub
        }

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

        @Override
        public Item getItem(int position)
        {
             return items.get(position);
        }

        @Override
        public long getItemId(int position)
        {
                return position;
        }

        public void setItems(ArrayList<Item> items)
        {
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
                View v = convertView;
                try
                {
                        v = inflater.inflate(R.layout.grid_item, null);
                }
                catch (NullPointerException npe)
                {
                        npe.printStackTrace();

                }                    

                Item item = items.get(position);

                try
                {
                        TextView name = (TextView) v.findViewById(R.id.grid_att_name);
                        TextView value = (TextView) v.findViewById(R.id.grid_att_value);


                        name.setText(item.getName());   
                        value.setText(item.getValue());
                }
                catch (NullPointerException npe)
                {
                        npe.printStackTrace();

                }

                return v;
        }
    }
}
Était-ce utile?

La solution

J'ai résolu ce problème en utilisant un adaptateur de État de fragment et j'ai dû ajouter android:configChanges="orientation" à la balise d'activité de l'activité qui abritait les fragments.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top