listview在片段上不起作用-OutOfMemoryError:无法分配 [英] listview does not work on fragment - OutOfMemoryError: Failed to allocate

查看:74
本文介绍了listview在片段上不起作用-OutOfMemoryError:无法分配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

ListView在片段上不起作用,我对此尝试了一些代码,但再次说到应用程序已停止"

ListView does not work on fragments, I tried some codes on this, but again it continues to say - "the app is stopped"

我的主要活动

public class OrtaMain extends Fragment {

    private ListView listView;
    private  int[] user_poster_resources={
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home
    };
    private int[] alt_resource={
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home
    };

    private String[] konu_basliks;
    private String[] konu_tarihs;
    private String[] konu_iceriks;
    OrtaMainAdapter adapter;

    public OrtaMain() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view       = inflater.inflate(R.layout.fragment_orta_main, container, false);
        listVie         = (ListView) view.findViewById(R.id.orta_main_liste);
        konu_basliks    = getResources().getStringArray(R.array.strin_baslik);
        konu_tarihs     = getResources().getStringArray(R.array.konu_tarih);
        konu_iceriks    = getResources().getStringArray(R.array.konu_icerik);

        int i = 0;
        adapter = new OrtaMainAdapter(getActivity(), R.layout.ortamain_item);
        listView.setAdapter(adapter);

        for (String basliklar:konu_basliks) {
            OrtaMainDataProvider dataProvider = new OrtaMainDataProvider(basliklar);
            adapter.add(dataProvider);
            i++;
        }
        return view; 
    }
}

数据提供者

public class OrtaMainDataProvider {
    private String baslik;

    public OrtaMainDataProvider(String baslik) {
        this.setBaslik(baslik);
    }

    public String getBaslik() {
        return baslik;
    }

    public void setBaslik(String baslik) {
        this.baslik = baslik;
    }
}

适配器类

public class OrtaMainAdapter extends ArrayAdapter {

    List list = new ArrayList();

    public OrtaMainAdapter(@NonNull Context context, @LayoutRes int resource) {
        super(context, resource);
    }

    @Override
    public void add(@Nullable Object object) {
        super.add(object);
        list.add(object);
    }

    static class DataHandler{
        TextView konu_baslik;
    }

    public int getCount(){
        return this.list.size();
    }

    @Nullable
    @Override
    public Object getItem(int position) {
        return this.list.get(position);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        View row;
        row = convertView;
        DataHandler handler;

        if (convertView == null){
            LayoutInflater inflater =(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.ortamain_item, parent, false);
            handler = new DataHandler();
            handler.konu_baslik = (TextView) row.findViewById(R.id.orta_main_baslik);
            row.setTag(handler);
        }
        else{
            handler = (DataHandler) row.getTag();
        }

        OrtaMainDataProvider dataProvider;
        dataProvider= (OrtaMainDataProvider) this.getItem(position);
        handler.konu_baslik.setText(dataProvider.getBaslik());

        return row;
    }
}

logcat信息

06-27 14:31:37.836 11336-11336/com.example.cc.trafikprojesi E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.cc.trafikprojesi, PID: 11336
                                                                          java.lang.OutOfMemoryError: Failed to allocate a 80281612 byte allocation with 16777216 free bytes and 42MB until OOM
                                                                              at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                              at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                                              at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                                                                              at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                                                                              at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:973)
                                                                              at android.content.res.Resources.loadDrawableForCookie(Resources.java:2423)
                                                                              at android.content.res.Resources.loadDrawable(Resources.java:2330)
                                                                              at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
                                                                              at android.widget.ImageView.<init>(ImageView.java:146)
                                                                              at android.widget.ImageView.<init>(ImageView.java:135)
                                                                              at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
                                                                              at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                                                                              at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                                                              at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1029)
                                                                              at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1087)

这些代码在任何简单的活动中都能正常工作.当我测试别人的时候.但是当我输入这些代码时,列表视图不起作用,并且模拟器正在停止..

Those codes are working well on any simple activity. When I test anothers. but when i put those codes, the listview does not work and emulator is stopping..

此外,当我不放置ListView代码时,fragment可以很好地工作,而fragment给出了错误,并且在模拟器上不起作用.

Also, fragment works well when I don't put the ListView code, and fragment give error and does not work on emulator.

ListView对片段不起作用吗?我必须只穿无碎片的衣服吗?

Do ListView not work on fragments? Must I put only on nonfragments?

推荐答案

这是我建议的内容,应该会有所帮助...

Here's what I recommend, it should help...

您可以忽略问题 不推荐 ,并通过将其添加到android清单文件中来增加heapSize:

You can ignore the problem not recommended and increase the heapSize by adding this to your android manifest file:

<application android:largeHeap="true"

还要设置Bitmap.Config类型为RGB_565而不是ARGB_8888,以保持位图较小.

Also set Bitmap.Config type RGB_565 instead of ARGB_8888 to keep the bitmaps smaller.

但是最好的选择是花一些时间并使用 LeakCanary 配置您的应用程序并采用观看此视频以学习Android的内存管理- Google I/O 2011:Android的内存管理应用(从 4:12 播放,以了解largeHeap=true为何不好. ),然后在 8:31 中详细了解了堆的使用.

But the best option here would be to take some time and profile your application with LeakCanary and take a look at this video to learn Memory Management for Android - Google I/O 2011: Memory management for Android Apps (Play from 4:12 to see why largeHeap=true is bad.) then at 8:31 they go into detail on understanding heap usage.

大堆修复程序是一个临时修复程序,不应视为最终修复程序.我强烈建议进行剖析,看看片段生命周期在Fragment完全完成之前调用onDetach()方法,您可能要在这里释放所有资源.片段本身被销毁并进行gc'ed操作并不意味着您分配的所有资源都将被删除.

The large heap fix it's a temporary fix and shouldn't be considered final. I highly recommend profiling, Take a look at the Fragment life cycle the method that is called before the Fragment is completely done with is the onDetach() method, you may want to release all the resources here. The fact that a fragment itself is destroyed and gc'ed does not mean all resources you allocated were removed.

这篇关于listview在片段上不起作用-OutOfMemoryError:无法分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆