【发布时间】:2016-06-22 06:57:13
【问题描述】:
我用ListView 和ViewPager 创建了一个应用程序。
我使用FragmentStatePagerAdapter 作为页面适配器。
单击列表中的项目时,打开pagefragment 以加载详细数据。
当单击项目时,我监视在 android studio 监视器中分配的内存
在列表视图中分配内存。
我的问题在这里: 当从寻呼机返回到列表并单击项目时,再次分配内存。 如果我完成了这些步骤,就会抛出 OutOfMemory。 我用
android:largeHeap="true"
但对我不起作用。 我的一些代码:
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。
-
这也不是 ViewPager 或 ListView 的问题,您应该提供更多详细信息。谷歌也不推荐设置大堆。
-
我在这里可能错了,但是您不需要一次又一次地创建寻呼机。使用“FragmentManager.findFragmentByTag”的“FragmentManager.findFragmentById”来检查片段是否已经存在。如果没有,则创建一个新实例。至于内存消耗,布局在做什么?它会显示大图像吗?
-
@GPuschka:我的观点是基于文本的。
-
@Amir: 如何设置大堆?
标签: android listview android-viewpager out-of-memory fragmentstatepageradapter