Pregunta

Estoy tratando de construir un fragmento que contenga una vista de cuadrícula para una buena interfaz de usuario. He usado parte del código de muestra para intentar construir esto.

¿Realmente necesito hacer un seguimiento y guardar el estado de mis fragmentos para interruptores de orientación (aparentemente lo hago) o me falta algo? Desde su sonido (es el fragmentPagerAdapter Docs) parece que el FragmentPagerAdapter me ahorra todos los estados ...

Basta decir, aquí está mi problema (tengo 4 fragmentos con algunas vistas de text en ellas):

1. Cuando inclino la pantalla en Fragment0, los datos subyacentes desaparecen y no reaparecerán hasta que me mueva al fragmento2.

2. Cuando inclino la pantalla en Fragment1, los datos subyacentes de TI y Fragment0 desaparecen y los datos de Fragment1 no reaparecerán hasta que vaya a Fragment3, pero los datos de Fragment0 reaparecerán cuando vaya a Fragment2 (al igual que el caso 1 anterior).

3. Cuando inclino la pantalla en Fragment2, los datos subyacentes de TI y Fragment1 desaparecen y Fragment1 reaparece si voy a Fragment3 y Fragment2 reaparecerá si voy a Fragment0.

4. Cuando inclino el fragmento33 solo fragmento2 desaparece.

Obviamente estoy haciendo algo mal, así que aquí está mi código:

Aquí está mi OnCreate (o algo al menos):

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

Aquí está mi 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));

            }

}

Aquí está mi Fragmento (con mi 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;
        }
    }
}
¿Fue útil?

Solución

Arreglé esto usando un fragmento Estado Adaptador y tuve que agregar android:configChanges="orientation" a la etiqueta de actividad de la actividad que albergaba los fragmentos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top