2015-02-23 49 views
0

我在我的活動中顯示片段,但似乎有些片段顯示(instatiating)兩次。我仔細檢查了我的代碼,但在我看來,一切都應該沒問題。問題是,當我顯示片段是可以的,但是在顯示另一個片段並顯示相同的片段後,就像重新加載調用同一個片段一樣,並顯示更新後的數據 - 儘管沒有更新數據。片段在海誓山盟上顯示兩次

這是我打電話給我的片段:

public void showFragment(Fragment fragment, Bundle bundle) { 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     fragment.setRetainInstance(true); 
     //TODO animation 
     if (!fragment.isVisible()) { 
      // ft.setCustomAnimations(R.anim.slide_in, R.anim.slide_out, R.anim.slide_in, R.anim.slide_out); 
      fragment.setArguments(bundle); 
      ft.replace(R.id.main_frag_container, fragment); 
      ft.commit(); 
     } 
     dismissLoading(); 
    } 

這裏是我的一個片段:

import android.app.Fragment; 
public class ProductFragment extends Fragment implements AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener { 
     private final String TAG = ProductFragment.class.getSimpleName(); 

     private View view; 

     private int index = -1; 
     private int top = 0; 

     private Spinner categorySpinner; 
     private ListView listView; 
     private ArrayAdapter<CharSequence> cityAdapter, categoryAdapter; 
     private ArrayList<Product> items; 
     private ProductsAdapter adapter; 


     private OnProductSelected productSelectedListener; 

     @Override 
     public void onAttach(Activity activity) { 
      super.onAttach(activity); 
      if (activity != null) { 
       productSelectedListener = (OnProductSelected) activity; 
      } 
     } 

     @Nullable 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      super.onCreateView(inflater, container, savedInstanceState); 
      view = inflater.inflate(R.layout.fragment_products, container, false); 
      Log.d(TAG, "PROducts frag started " + getArguments().getSerializable(ActivityConstants.PRODUCT_ITEMS)); 
      listView = (ListView) view.findViewById(R.id.products_listView); 

      if (getArguments().getSerializable(ActivityConstants.PRODUCT_ITEMS) != null) { 
       loadList((ArrayList<Product>) getArguments().getSerializable(ActivityConstants.PRODUCT_ITEMS)); 
      } 

      initWidgets(view); 
      return view; 
     } 

     public void loadList(ArrayList<Product> data) { 
      items = data; 
      adapter = new ProductsAdapter(getActivity(), items); 
      Log.d(TAG, "ITEMS SIZE" + items.size()); 
      listView.setAdapter(adapter); 

     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      try { 
       index = listView.getFirstVisiblePosition(); 
       View v = listView.getChildAt(0); 
       top = (v == null) ? 0 : v.getTop(); 
      } catch (Throwable t) { 
       t.printStackTrace(); 
      } 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 

    //  setListAdapter(mAdapter); 
      if (index != -1) { 
       listView.setSelectionFromTop(index, top); 
      } 


     } 

     /** 
     * Initialize fragment widgets 
     */ 
     private void initWidgets(View view) { 
      categorySpinner = (Spinner) view.findViewById(R.id.products_spinner_cat); 
      getActivity().invalidateOptionsMenu(); 
      ((MainActivity) getActivity()).initActionBar(true); 
      listView.setOnItemClickListener(this); 

      //set citySpinner adapter 
      cityAdapter = ArrayAdapter.createFromResource(getActivity(), 
        R.array.cities, android.R.layout.simple_spinner_item); 
      cityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

      //set categorySpinner adapter 
      categoryAdapter = ArrayAdapter.createFromResource(getActivity(), 
        R.array.categores, android.R.layout.simple_spinner_item); 
      categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      categorySpinner.setAdapter(categoryAdapter); 
      categorySpinner.setOnItemSelectedListener(this); 

      categorySpinner.setSelection(0); 
      ((MainActivity) getActivity()).dismissLoading(); 
      Log.d(TAG, "Fragment inited"); 
     } 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(TAG, "onItemClick " + position); 
      productSelectedListener.onProductSelected(items.get(position)); 
     } 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(TAG, "POSITION " + position); 

      if (position == 0) { 
       position += 1; 
      } 
      getListing(getResources().getStringArray(R.array.categores)[position].toLowerCase()); 


     } 


     private void getListing(String category) { 
      AppHttpClient.getInstance(); 
      String serverURL = ServerUtil.SERVER_BASE_URL + ServerUtil.PRODUCTS + category; 
      Log.d(TAG, "Server url: " + serverURL); 
      AppHttpClient.executeMethod(ServerUtil.METHOD_GET_PRODUCTS, serverURL, null, getActivity()); 
     } 


     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      Log.d(TAG, parent.getId() + " "); 
     } 

    } 

有人可以幫我解決這個問題? 謝謝!

+0

你可以編輯你的問題,解釋什麼讓你認爲數據更新,並張貼你用來從一個片段切換到另一個片段的代碼? – JDenais 2015-02-24 06:07:34

回答

0

如果您使用您發佈的代碼從一個片段切換到另一個片段,我會說它可能來自您將片段傳遞給showFragment()方法的方式。如果您在將其傳遞給showFragment()之前創建新的片段,則通常會創建新片段並將其添加到其他片段之上。

您應該使用getFragmentManager()。findFragmentByTag(String Tag)來獲取已經存在的片段並將其重新添加到片段堆棧頂部。

0

首先讓您的視圖變爲靜態,然後將代碼粘貼到片段中的onCreateView中。

private static View view=null; 

if (view == null) { 
      view = inflater.inflate(R.layout.fragment_movies, container, false); 

      //code here for first time initialization 
     } else if (view != null) { 
      //your code here 
     }