【问题标题】:Out of memory Exception in ListView and pagerview togetherListView 和 pagerview 一起出现内存不足异常
【发布时间】:2016-06-22 06:57:13
【问题描述】:

我用ListViewViewPager 创建了一个应用程序。 我使用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


【解决方案1】:

试试这个

放入Mainfest--->

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

可能会有所帮助

【讨论】:

    【解决方案2】:

    可能是您的 readFromParcel 和 writeToParcel 方法不匹配,如果您可以避免将整个数组列表传递给片段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      相关资源
      最近更新 更多