2012-08-01 35 views
0

下面是2段代碼。每一個都有一個名爲IconicAdapter的內部類。在getView方法中,我們創建了一個稱爲行的View實例。我的問題是...我們已經實例化行的方式有什麼區別。使用佈局充氣器並使用super.getview()。如果這個例子犯規賺取差價明顯的話,請解釋一下,我會用佈局充氣的一個具體的例子:使用layoutinflator添加什麼值添加

示例1:

public class DynamicDemo extends ListActivity { 
    TextView selection; 
    private static final String[] items={"lorem", "ipsum", "dolor", 
      "sit", "amet", 
      "consectetuer", "adipiscing", "elit", "morbi", "vel", 
      "ligula", "vitae", "arcu", "aliquet", "mollis", 
      "etiam", "vel", "erat", "placerat", "ante", 
      "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    setListAdapter(new IconicAdapter()); 
    selection=(TextView)findViewById(R.id.selection); 
    } 

    public void onListItemClick(ListView parent, View v, 
           int position, long id) { 
    selection.setText(items[position]); 
    } 

    class IconicAdapter extends ArrayAdapter<String> { 
    IconicAdapter() { 
     super(DynamicDemo.this, R.layout.row, items); 
    } 

    public View getView(int position, View convertView, 
         ViewGroup parent) { 
     LayoutInflater inflater=getLayoutInflater(); 
     View row=inflater.inflate(R.layout.row, parent, false); 
     TextView label=(TextView)row.findViewById(R.id.label); 

     label.setText(items[position]); 

     ImageView icon=(ImageView)row.findViewById(R.id.icon); 

     if (items[position].length()>4) { 
     icon.setImageResource(R.drawable.delete); 
     } 
     else { 
     icon.setImageResource(R.drawable.ok); 
     } 

     return(row); 
    } 
    } 
} 

示例2:

public class DynamicDemo extends ListActivity { 
    TextView selection; 
    private static final String[] items={"lorem", "ipsum", "dolor", 
      "sit", "amet", 
      "consectetuer", "adipiscing", "elit", "morbi", "vel", 
      "ligula", "vitae", "arcu", "aliquet", "mollis", 
      "etiam", "vel", "erat", "placerat", "ante", 
      "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    setListAdapter(new IconicAdapter()); 
    selection=(TextView)findViewById(R.id.selection); 
    } 

    public void onListItemClick(ListView parent, View v, 
           int position, long id) { 
    selection.setText(items[position]); 
    } 

    class IconicAdapter extends ArrayAdapter<String> { 
    IconicAdapter() { 
     super(DynamicDemo.this, R.layout.row, items); 
    } 

    public View getView(int position, View convertView, 
         ViewGroup parent) { 
     LayoutInflater inflater=getLayoutInflater(); 
     View row=super.getView(position, convertView, parent); 
     TextView label=(TextView)row.findViewById(R.id.label); 

     label.setText(items[position]); 

     ImageView icon=(ImageView)row.findViewById(R.id.icon); 

     if (items[position].length()>4) { 
     icon.setImageResource(R.drawable.delete); 
     } 
     else { 
     icon.setImageResource(R.drawable.ok); 
     } 

     return(row); 
    } 
    } 
} 

回答

2

在使用LayoutInflater的第一種情況下,您將爲ListView的行膨脹一個佈局文件View。這讓我們完全覆蓋方法中構建行View的方式。您通常會想要使用它,因爲它非常靈活,並使您完全控制(但您也必須小心並優化getView方法,而不像您在提供的樣本中那樣)。

在第二種情況下,您正在使用由超類getView方法返回的View。在這種情況下,你讓ArrayAdapter超級類實現View像它想要的,然後使用這個簡單的View進一步更新/修改它。當您對超類構建行視圖的方式感到滿意並且只打算對已經構建的View進行細微更改時,此方法特別有用。例如,假設您生成一個擴展爲ArrayAdapter的自定義適配器,並且在此適配器中,您希望爲行視圖使用替代背景顏色。然後,你將實現getView方法是這樣的:

public View getView(int position, View convertView, ViewGroup parent) { 
     // let the superclass build the View and set the data on it 
     View row=super.getView(position, convertView, parent); 
     // we want to modify the View's background so we do 
     if (position % 2 == 0) { 
      row.setBackgroundColor(Color.RED); 
     } else { 
      row.setBackgroundColor(Color.GREEN); 
     } 
     return row; 
} 

我們可以使用LayoutInflator但在外觀上只是一個小變化是沒有用的。

2

在理論上存在根本沒有差別,但在實踐中有。

您忽略convertView參數,但ArrayAdapter不會。 convertView是用於黃油順利滾動的棘手優化。滾動時,listview會週期性地在提供的適配器上調用getView方法。在你的情況下(樣本#2),你創建了許多垃圾GC堆的對象。此外,你每次都從XML擴展你的佈局。 ArrayAdapter.getView,而不是創建新的對象重用原來的,只是調用textView.setText(順便說一句,你叫label.setText兩次:第一次在super.getView,和第二label.setText(items[position])

此外,您quering每次View小號實例中getView致電findViewById。而不是嘗試使用ViewHolder pattern