0

Ich erstelle eine Anwendung mit ListView und ViewPager. Ich benutzte FragmentStatePagerAdapter als pageradapter.Nicht genügend Speicher Ausnahme in ListView und Pagerview zusammen

Wenn Sie auf ein Element in der Liste klicken, öffnen Sie eine pagefragment, um Detaildaten zu laden. Ich Monitor Speicher im Android Studio-Monitor zugeordnet, wenn Sie auf Element in der Listenansicht Speicher zugewiesen ist.

Mein Problem ist hier: wenn zurück von Pager zu Liste, und klicken Sie auf Element, Speicher ist wieder zugewiesen. Wenn ich diese Schritte gemacht habe, wird ein OutOfMemory geworfen. Ich benutze

android: largeHeap = "true"

Aber für mich nicht funktioniert. Einige Stück meines Code:

Listenansicht onItemClickListener:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       //peace of code that create launch new fragment with swipe view inside 

       FragmentPager fragmentPager = new FragmentPager(); 
       Bundle bundle = new Bundle(); 
       bundle.putInt("CURRENT_POSITION", position); 

       bundle.putParcelableArrayList("DATA_LIST", data); 

       fragmentPager.setArguments(bundle); 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       FragmentTransaction ft = fragmentManager.beginTransaction(); 
       ft.replace(R.id.container, fragmentPager, "swipe_view_fragment"); 
       ft.addToBackStack(null); 
       ft.commit(); 

      } 
     }); 

Mein FragmentPager:

public class FragmentPager extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 

     if(v==null) 
      v = inflater.inflate(R.layout.fragment_pager, container, false); 
     if(mViewPager==null) 
      mViewPager = (ViewPager) v.findViewById(R.id.pager_view); 

     currentPosition = getArguments().getInt("CURRENT_POSITION"); 

     data = getArguments().getParcelableArrayList("DATA_LIST"); 


     FragmentItemPagerAdapter fragmentItemPagerAdapter = new FragmentItemPagerAdapter(getFragmentManager(), data,this.getActivity()); 
     mViewPager.setOffscreenPageLimit(1); 
     mViewPager.setAdapter(fragmentItemPagerAdapter); 
     mViewPager.setCurrentItem(currentPosition); 
     fragmentItemPagerAdapter.notifyDataSetChanged(); 

     return v; 
    } 
} 

und meine FragmentItemPagerAdapter:

public class FragmentItemPagerAdapter extends FragmentStatePagerAdapter { 
@Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 
     container.removeView(container); 
     /*if (position >= getCount()) { 
      container.removeAllViews(); 
      FragmentManager manager = ((Fragment) object).getFragmentManager(); 
      FragmentTransaction trans = manager.beginTransaction(); 
      trans.remove((Fragment) object); 
      trans.commit(); 
     }*/ 

    } 

} 
+0

von pagerView meinst du ViewPager? Ich empfehle RecyclerView in diesem Fall wirklich zu verwenden. – Amir

+1

Und auch dies nicht mit ViewPager oder ListView, sollten Sie mehr Details geben, was los ist. Auch Einstellung großer Haufen nicht von Google empfehlen. – Amir

+0

Ich könnte hier falsch liegen, aber Sie müssen den Pager nicht immer wieder neu erstellen. Verwenden Sie 'FragmentManager.findFragmentById' von 'FragmentManager.findFragmentByTag', um zu prüfen, ob das Fragment bereits existiert. Wenn dies nicht der Fall ist, erstellen Sie eine neue Instanz. Was für den Speicherverbrauch macht das Layout? Zeigt es große Bilder an? – GPuschka

Antwort

0

Versuchen Sie, diese

put in Mainfest --->

<application 
     android:largeHeap="true" 
    > 
..... 
    </application> 

kann es nicht

+0

funktioniert nicht für mich. –

0

Ihre readFromParcel und writeToParcel Methoden möglicherweise nicht übereinstimmen helfen, und wenn Sie ganze Liste von Array an das Fragment passieren zu vermeiden.