Extraños fragmentos desapeadores con fragmentPagerAdapter
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;
}
}
}
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.