2

Я пытаюсь создать фрагмент, содержащий сетку для приятного интерфейса. Я использовал некоторые примеры кода, чтобы попытаться построить это.Weird dissappearing Fragments with FragmentPagerAdapter

Нужно ли мне отслеживать и сохранять состояние моих фрагментов для переключателей ориентации (видимо, я это делаю), или я чего-то не хватает? От звука его (причем в FragmentPagerAdapter документы), кажется, как FragmentPagerAdapter сохраняет все государства для меня ...

Достаточно сказать, что здесь моя проблема (у меня есть 4 фрагмента с некоторыми TextViews в них):

1. Когда я наклоняю экран на Fragment0, базовые данные исчезают и не появятся снова, пока я не перейду на Фрагмент2.

2. Когда я наклонять экран на Fragment1, лежащих в основе данных об этом и Fragment0 исчезает, и данные Fragment1 по обыкновению появляются, пока я не пойти к данным Fragment3 но Fragment0 будет появляться, когда я иду в FRAGMENT2 (так же, как случай 1 выше).

3. Когда я наклонять экран на FRAGMENT2, лежащих в основе данных об этом и Fragment1 исчезает и Fragment1 появляется снова, если я иду в Fragment3 и FRAGMENT2 появится снова, если я пойду к Fragment0.

4. Когда я наклоняю Fragment3, только Fragment2 исчезает.

Очевидно, я делаю что-то неправильно, так вот мой код:

Вот мой OnCreate (или некоторые из них по крайней мере):

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

Вот мой 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)); 

      } 

} 

Это мой Фрагмент (с моей 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; 
     } 
    } 
} 
+0

Этот вопрос является спасателем жизни для меня. Спасибо. – iamkristher

ответ

4

Я исправил это с помощью фрагмента государственного адаптера, и я должен был добавить android:configChanges="orientation" к деятельности тегу деятельности, которая размещалась фрагменты.

+0

WOW LIFE SAVER. – tonyl7126