Strani frammenti di scomparsa con frammentpageradapter
Domanda
Sto cercando di costruire un frammento che contiene una griglia per una bella interfaccia utente. Ho usato parte del codice di esempio per provare a costruire questo.
Ho davvero bisogno di tenere traccia e salvare lo stato dei miei frammenti per gli switch di orientamento (a quanto pare) o mi manca qualcosa? Dal suono di esso (essendo i documenti frammentpageradapter) sembra che il frammentpageradapter salva tutti gli stati per me ...
Basti dire che ecco il mio problema (ho 4 frammenti con alcuni textviews):
1. Quando inclinerò lo schermo su Fragment0, i dati sottostanti scompare e non riappariranno fino a quando non mi spostarò su Fragment2.
2. Quando inclinerò lo schermo su Fragment1, i dati sottostanti di esso e Fragment0 scompare e i dati di Fragment1 non riapparranno fino a quando non vado a Fragment3 ma i dati di Fragment0 riappariranno quando vado a Fragment2 (proprio come il caso 1 sopra).
3. Quando inclina lo schermo su Fragment2, i dati sottostanti di esso e Fragment1 scompaiono e Fragment1 riappare1 se vado a Fragment3 e Fragment2 riappariranno se vado a Fragment0.
4. Quando inclina il frammento3 solo frammento2 scompare.
Ovviamente sto facendo qualcosa di sbagliato, quindi ecco il mio codice:
Ecco il mio OnCreate (o un po 'di esso almeno):
mAdapter = new FragPagerAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
Ecco il mio frammentpageradapter:
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));
}
}
Ecco il mio Frammento (con il mio 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;
}
}
}
Soluzione
L'ho risolto usando un frammento Stato Adattatore e dovevo aggiungere android:configChanges="orientation"
al tag di attività dell'attività che ospitava i frammenti.