Я создаю приложение с ListView
и ViewPager
. я использовал FragmentStatePagerAdapter
как пейджер.Недостаточно памяти Исключение в ListView и pagerview вместе
при нажатии на элементе списка в списке pagefragment
для загрузки дополнительных данных. Я контролирую выделенную память в мониторе студии Android, при нажатии на элемент в виде списка выделяется память.
Моя проблема: Когда вы возвращаетесь из пейджера в список и нажимаете на элемент, память выделяется снова. , если я сделаю это, выйдет OutOfMemory. Я использую
андроид: largeHeap = "истинный"
Но не работает для меня. Некоторые часть моего кода:
ListView 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();
}
});
Мой 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;
}
}
и мой 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();
}*/
}
}
от pagerView вы имеете в виду ViewPager? В этом случае я рекомендую использовать RecyclerView. – Amir
А также это не проблема с ViewPager или ListView, вы должны дать более подробную информацию о том, что происходит. Также установка большой кучи не рекомендуется Google. – Amir
Возможно, я ошибаюсь, но вам не нужно создавать пейджер снова и снова. Используйте 'FragmentManager.findFragmentById' 'FragmentManager.findFragmentByTag', чтобы проверить, существует ли фрагмент. Если это не так, создайте новый экземпляр. Что касается потребления памяти, что делает макет? Отображает ли она большие изображения? – GPuschka