2016-03-28 21 views
1

データを表示するためのテキストビューを持つカスタムリストビューがあり、ビューホルダーパターンを使用してメモリ使用量を最適化していますが、リストビューを連続してスクロールすると、 android studio内)リストビューのメモリ使用量

問題をどのように解決すればよいですか?

@Override 
public View getView(int position, View view, ViewGroup parent) { 

    ViewContainer viewContainer; 
    View rowView = view; 

    if(rowView==null){ 

     LayoutInflater inflater = context.getLayoutInflater(); 
     rowView= inflater.inflate(R.layout.lv2rowlayout, null, true); 

     viewContainer = new ViewContainer(); 
     //---get a reference to all the views on the xml layout--- 

     viewContainer.txten = (TextView) rowView.findViewById(R.id.txten); 
     viewContainer.txtfars = (TextView) rowView.findViewById(R.id.txtfars); 



     String s ; 
     Typeface custom_font; 

     viewContainer.txten.setTextSize(TypedValue.COMPLEX_UNIT_SP,sd.enSize); 
     s="fonts/"+sd.enFont; 
     custom_font = Typeface.createFromAsset(context.getAssets(),s); 
     viewContainer.txten.setTypeface(custom_font); 
     viewContainer.txten.setTextColor(sd.enColor); 

     viewContainer.txtfars.setTextSize(TypedValue.COMPLEX_UNIT_SP,sd.farssize); 
     s="fonts/"+sd.farsFont; 
     custom_font = Typeface.createFromAsset(context.getAssets(),s); 
     viewContainer.txtfars.setTypeface(custom_font); 
     viewContainer.txtfars.setTextColor(sd.farsColor); 

     rowView.setTag(viewContainer); 
    } 
    else { 
     viewContainer = (ViewContainer) rowView.getTag(); 

    } 

    //---customize the content of each row based on position--- 
    viewContainer. txten.setText(en[position]); 
    viewContainer.txtfars.setText(fars[position]); 

    return rowView; 
} 
+0

あなたの書体は位置に依存しないので、グローバル変数を宣言してリストビューのコンストラクタで初期化するのはなぜですか? – Kaustuv

+0

はいこれは本当の意味です –

答えて

2

は、私はいくつかのデバイス上でメモリリークが発生することがあり、その(https://code.google.com/p/android/issues/detail?id=9904)に関する既知の問題があり、それはTypeface.createFromAsset(...)についてです、それはListViewではないと思います。あなたはこのような書体の作成をキャッシュすることができ :以下のように設定する

public class FontCache { 

    private static Hashtable<String, Typeface> fontCache = new Hashtable<String, Typeface>(); 

    public static Typeface get(String name, Context context) { 
     Typeface tf = fontCache.get(name); 
     if(tf == null) { 
      try { 
       tf = Typeface.createFromAsset(context.getAssets(), name); 
      } 
      catch (Exception e) { 
       return null; 
      } 
      fontCache.put(name, tf); 
     } 
     return tf; 
    } 
} 
+0

代わりに、これは: 's =" fonts/"+ sd.enFont; custom_font = Typeface.createFromAsset(context.getAssets()、s); viewContainer.txten.setTypeface(custom_font); ' これでタイプフェイスを設定します:' s = "fonts /" + sd.enFont; viewContainer.txten.setTypeface(FontCache.get(s、context)); ' – GaborNovak

0

試みは、アダプタのコンストラクタで custom_font = Typeface.createFromAsset(context.getAssets(),s);スニペット。