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();
}*/
}
}
von pagerView meinst du ViewPager? Ich empfehle RecyclerView in diesem Fall wirklich zu verwenden. – Amir
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
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