2017-06-27 13 views
0

ListViewを割り当てることができませんでした、私はこの上でいくつかのコードを試してみましたが、再び、それは言って続けて - 「アプリが停止され、」リストビュー - OutOfMemoryErrorのは:断片上では動作しません

私の主な活動

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) 

これらのコードは、任意の単純活動にも取り組んでいます。私は別のものをテストするとき。しかし、私はそれらのコードを置くと、リストビューは動作しません。エミュレータは停止しています。

また、ListViewコードを入れていないとフラグメントがうまく動作し、エラーが発生し、エミュレータでは機能しません。

ListViewはフラグメントでは機能しませんか?私は非断片化のみに置く必要がありますか?ここで

+0

フラグメント内に 'ListView'を持つことは可能ですが、あなたのlogcatエラーを提供してください。 – Dayan

+0

logcatエラー??あなたはアンドロイドスタジオのログイベントを意味しますか? –

+0

'MenuBar - > Window - > Show view - > Other - > logcat' - ここでは例外を赤で見つけることができます。しかし、はい、あなたが持っている例外を追加してください。 – Dayan

答えて

0

は、それはあなたがをお勧めしません、問題を無視して、あなたのAndroidマニフェストファイルにこれを追加することによって、ヒープサイズを増やすことができます...

を助けなければならない、私はお勧め何:

<application android:largeHeap="true"

ARGB_8888の代わりにBitmap.ConfigタイプRGB_565を設定して、ビットマップを小さくします。

しかし、ここでは最良のオプションは、いくつかの時間がかかるし、LeakCanaryでアプリケーションのプロファイリングとAndroid用のメモリ管理を学ぶためにこのビデオを見てみることであろう - (。largeHeap=trueが悪い理由は4:12から再生)Google I/O 2011: Memory management for Android Apps、その後で8:31ヒープの使用方法の詳細については、

大きなヒープフィックスは一時的な修正であり、最終とはみなされません。プロファイリングを強くお勧めします。onDetach()メソッドを使用してフラグメントが完全に終了する前に呼び出されるメソッドFragment life cycleを見て、ここですべてのリソースを解放することができます。フラグメント自体が破壊されてgc'edされたということは、割り当てたすべてのリソースが削除されたという意味ではありません。

+0

あなたのご協力ありがとうございました。 –

+0

あなたは非常に歓迎されています。 'largeHeap = true'は修正とはみなされません。問題がはるかに大きくなる可能性があるためです。アプリケーションにメモリがリークしている場合は、重い使用で再び破損する可能性があります。明日までに確認してください。答えはより堅牢になります。良いものを持っている。 – Dayan

関連する問題