0

Я создаю приложение с 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(); 
     }*/ 

    } 

} 
+0

от pagerView вы имеете в виду ViewPager? В этом случае я рекомендую использовать RecyclerView. – Amir

+1

А также это не проблема с ViewPager или ListView, вы должны дать более подробную информацию о том, что происходит. Также установка большой кучи не рекомендуется Google. – Amir

+0

Возможно, я ошибаюсь, но вам не нужно создавать пейджер снова и снова. Используйте 'FragmentManager.findFragmentById' 'FragmentManager.findFragmentByTag', чтобы проверить, существует ли фрагмент. Если это не так, создайте новый экземпляр. Что касается потребления памяти, что делает макет? Отображает ли она большие изображения? – GPuschka

ответ

0

Попробуйте

положить в MainFest --->

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

может это поможет

+0

не работает для меня. –

0

Может быть ваши readFromParcel и writeToParcel методы не соответствуют, и если вы можете избежать, чтобы пройти весь список массива фрагмента.