2016-06-18 9 views
0

私がスクロールしたときに私の問題とOutOfMemoryエラーが発生ListViewGridViewの両方を持っているが、私はので、私はスニル初のソリューションを使用し、私のコードでそれを実装する問題についてオンラインで読むとthis質問を見ました。 GridViewためとListView画像は「/res/drawable/image1.png」であるというように、私はCustomAdapterクラスにこのint配列public static int[] mDrawableImg = {R.drawable.back, R.drawable.arrows, R.drawable.bomber, R.drawable.archers, R.drawable.knight};に合格し、この使用:今、あなたは、私が追加参照としてアンドロイドリストビューのOutOfMemory - ImageBitmaps

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final Holder holder = new Holder(); 
    final View rowView = inflater.inflate(R.layout.program_list2, null); 
    holder.img = (ImageView) rowView.findViewById(R.id.imageView1); 
     holder.img.setImageResource(imageId[position]); 
    // holder.img.setImageBitmap(convertBitmap(String.valueOf(imageId[position]))); 
      return rowView; 
} 

convertBitmapという機能を持つBitmapから画像をロードするコード行は、私のGridViewは空です。そのスクロール可能な意味は項目がありますが、画像はロードされません。

convertBitmap機能:

public static Bitmap convertBitmap(String path) { 
    Bitmap bitmap = null; 
    BitmapFactory.Options bfOptions = new BitmapFactory.Options(); 
    bfOptions.inDither = false; 
    bfOptions.inTempStorage = new byte[32 * 1024]; 
    File file = new File(path); 
    FileInputStream fs = null; 
    try { 
     fs = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if (fs != null) { 
      bitmap = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (fs != null) { 
      try { 
       fs.close(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 
     } 
    } 
    return bitmap; 
} 

は私が間違って何をした、それは私のOutOfMemoryエラーを解決するのだろうか?ありがとう。

答えて

1

エラーは絶対に論理的です。あなたのgetView()方法では、この行を見てください:

final View rowView = inflater.inflate(R.layout.program_list2, null);

それが何を意味するのでしょうか?これは、AndroidがあなたにViewをリクエストするたびにアイテムの新しいインスタンスを作成していることを意味します。 ListViewをスクロールしている間に、より多くのビューを作成して作成するだけなので、これはかなり狂っています(メモリ不足エラーが発生するのは当然です)。ListViewが遅いです。

Androidスタジオでは、この行に黄色の色を付けてこの問題を警告してくれます。

あまりにも簡単に修正できます。しかし、私はあなたにいくつかのことを言わせてくれます。 getView()メソッドで受け取っているViewをパラメータとして見てください。あなたはそれを見ない?あなたが呼び出した変数はconvertViewですか?そしてあなたはそれを使用していないことに注意してください。これはなんですか?View?リサイクルされたビューと呼ばれます(RecyclerViewクラスと混同しないでください)。以前は膨らんでいて、ユーザーが見ることができないために使用されなくなったビューです。そして、これは私の友人です、これはあなたの問題の鍵であり、あなたの解決策の鍵です。毎回新しいビューを1つ増やす代わりに、それをリサイクルしてください。私はあなたが非常に簡単だと約束します。今すぐあなたのgetView methosは次のようになります。

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
     convertView = inflater.inflate(R.layout.program_list2, null); 

    //final Holder holder = new Holder(); 
    //holder.img = (ImageView) convertView.findViewById(R.id.imageView1); 
    //holder.img.setImageResource(imageId[position]); 


    ImageView img = (ImageView) convertView.findViewById(R.id.imageView1); 
    //Note you don't need the Holder 
    Bitmap imageBitmap = convertBitmap(imageId[position]); 
    if (imageBitmap != null) 
     img.setImageBitmap(imageBitmap); 
    else 
     img.setImageBitmap(null); 

    return convertView; 
} 

そしてViewHolderパターンの使用状況を見てください。あなたはそれを間違って使用しています...

+0

あなたはrowViewを返していますが、存在しません。どうすればいいですか? – DAVIDBALAS1

+0

@ DAVIDBALAS1Oh、私の間違い。編集された答えを見てください。あなたは同じconvertViewを使用する必要があります –

+0

とにかく残念なことにスクロールはまだ少し遅いです。 – DAVIDBALAS1