ListView
とViewPager
でアプリケーションを作成します。 私はFragmentStatePagerAdapter
をpageradapterとして使用しました。メモリ不足ListViewとpagerviewでの例外
リストのアイテムをクリックすると、詳細データをロードするpagefragment
を開きます。 リストビューメモリ内のアイテム をクリックすると、アンドロイドスタジオモニタに割り当てられたメモリを監視します。
私の問題はここにあります: ページャからリストに戻ってアイテムをクリックすると、再びメモリが割り当てられます。 この手順を実行すると、OutOfMemoryがスローされます。 largeHeap = "true" を
しかし、私のために動作しません: 私は
アンドロイドを使用しています。 私のコードのいくつかの作品:
リストビュー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(); }*/ } }
by pagerあなたはViewPagerを意味しますか?この場合、RecyclerViewを使用することをお勧めします。 – Amir
また、これはViewPagerやListViewでは問題にはなりません。何が起きているのか詳しく説明してください。また、Googleによって推奨されない大きなヒープを設定します。 – Amir
ここで間違っているかもしれませんが、ページャーを何度も作成する必要はありません。フラグメントがすでに存在するかどうかを確認するには、 'FragmentManager.findFragmentByTag'の 'FragmentManager.findFragmentById'を使用します。そうでない場合は、新しいインスタンスを作成します。メモリ消費量は、レイアウトは何ですか?それは大きなイメージを表示していますか? – GPuschka