2011-07-01 7 views
3

私のアプリケーションは最初のランチに6.5MBを使用しています.3つのタブを持つアクティビティを入力すると、リストビューを表示するタブで14MBが使用されます!!カスタムアダプターを使用すると、さらにRAMが使用されますか?

これは、SimpleAdapterを使用して「不良コード」からカスタムアダプターに移動したときに発生しました。

私が望むのは、リストビューの両側に2つの文字列です。文字列は、ここでは、配列内にある、私は人々が行うには間違った方法である私に言ったことを利用した方法です。

String[] array= getResources().getStringArray(R.array.Names_List); 

int lengthtmp= array.length; 
for(int i=0;i<lengthtmp;i++) 
{ 
    counter++; 
    AddToList(array[i]);    
} 

adapter = new SimpleAdapter(this,list,R.layout.start_row,new String[] {"number","suraname"},new int[] {R.id.Start_Numbering,R.id.Start_Name}); 


private void AddToList(String name) { 
HashMap<String,String> temp = new HashMap<String,String>(); 


temp.put("number", Integer.toString(SortingPictures[counter-1])); 

temp.put("suraname", name); 
list.add(temp); 

    } 

このコードでは、活動は、ラムの10メガバイトを取ります。カスタムアダプタを使用するようにコードを変更した後、カスタムアダプタを使用すると、なぜそれほど多くのRAMを使用するのか教えてください。このカスタムアダプターに問題がありますか?

EDIT1:私はこのラインでExceptionNullPointerを得る

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder  holder; 

    if(convertView == null) { 
     convertView = mInflater.inflate(R.layout.start_row, parent,false); 
     holder=new ViewHolder(); 

     holder.tv_SuraName =(TextView)convertView.findViewById(R.id.Start_Name); 
     holder.tv_PageNumber = (TextView)convertView.findViewById(R.id.Start_Numbering); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.tv_SuraName.setText(SuraNames[position]); 
    holder.tv_PageNumber.setText(Integer.toString(PageNumber[position])); 

    return convertView; 
} 

:これは1つがdziobasによって提案されたより良いコードです」convertView = mInflater.inflate(R.layout.start_row、親、偽); "なぜですか?

答えて

3

あなたはgetViewのビューをリサイクルしていません。

それははるかに良いでしょう。このような:

public class ListView_Start_Adapter extends BaseAdapter { 
    private String[]   SuraNames; 
    private int[]    PageNumber; 
    RelativeLayout.LayoutParams param; 
    Context      mContext; 

    public ListView_Start_Adapter(Context context, String[] SuraNames, int[] PageNumber) { 
     mContext  = context; 
     this.SuraNames = SuraNames; 
     this.PageNumber = PageNumber; 
     param   = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); 
     param.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    } 

    @Override 
    public int getCount() { 
     return SuraNames.length; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return SuraNames[arg0]; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return PageNumber[arg0]; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder  holder; 
     RelativeLayout rowView; 

     if(convertView == null) { 
      //create view 
      rowView    = new RelativeLayout(mContext); 
      holder    = new ViewHolder(); 
      holder.tv_SuraName = new TextView(mContext); 
      holder.tv_PageNumber = new TextView(mContext); 
      rowView.addView(holder.tv_SuraName, param); 
      rowView.addView(holder.tv_PageNumber); 
      rowView.setTag(holder); 
     } else { 
      //recycle view 
      rowView = (RelativeLayout) convertView; 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     //fill views 
     holder.tv_SuraName.setText(SuraNames[position]); 
     holder.tv_PageNumber.setText(Integer.toString(PageNumber[position])); 

     return rowView; 
    } 

    class ViewHolder { 
     RelativeLayout relativeView; 
     TextView  tv_SuraName; 
     TextView  tv_PageNumber; 
    } 
} 

とビューの作成を変更します。 LayoutInflaterを使用し、レイアウトにxmlを使用します。

リストビューアダプターの効率の詳細については、this presentationを参照してください。

+0

+1私はこれに似たような答えを書いていました。前述のようにビューを作成し、convertViewを使用します。 [2009年のこのプレゼンテーション](http://www.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.html)も参照してください。ビューがリサイクルされる方法についての良い視覚的な説明もあります[ここ](http://android.amberfog.com/?p=296)。 –

+0

Edit1を読んでください。プログラムで作成するよりもxmlから膨らませるのが良いですか? – Omar

0

まず、新しいビューを作成する代わりに、getViewに渡されたconvertViewの使用を開始することをお勧めします。高性能(ガーベッジ・コレクションの数が減り、ビュー構成が少なくて済む)になり、メモリー使用量が低下する可能性があります。

2

あなたはすべての単一のエントリの新鮮なrelativeViewを返すすべてのエントリのために

をUI要素を生成しません。これは意志

  1. 使用より多くのメモリが
  2. getViewメソッド

    // In the class 
    private LayoutInflater inflater; 
    
    // in the constructor 
        inflater = (LayoutInflater) 
         context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    
    // getView() 
        if (view == null) { 
         view = inflater.inflate(R.layout.element_layout, parent, false); 
        } 
    

    を実装するために、ガベージコレクタ

使用通常の方法でより多くの圧力を置きSimpleAdapterソースコードが提供されています

SimpleAdapter.javaをご覧ください。ソースコードは自由に入手できます。ちょうどすべてのアダプターがこれらのコードブロックを持っています。

ハッピーハッキング!

関連する問題