2015-09-04 115 views
0

我正在爲ListView編寫我自己的適配器,但我遇到了一些概念問題。首先,這是我寫的:誰在ArrayAdapter中調用getView()?

public class MyArrayAdapter extends ArrayAdapter<String> { 
    private final Context context; 
    private final int parent; 
    private final String[] values; 

    public MyArrayAdapter(Context context, int resourceid, String[] values) { 
     super(context, -1, values); 
     this.context = context; 
     this.parent = resourceid; 
     this.values = values; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.rowlayout, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.icon); 
     textView.setText("abcde lorem ipsum"); 
     String s = values[position]; 
     imageView.setImageResource(R.drawable.no); 

     return rowView; 
    } 
} 

正如你們所看到的,我加了RESOURCEID作爲構造函數的參數,因爲this page告訴我,它必須採取3個參數。但是,在this article的3.3示例中,當它寫入自定義適配器時,它使用構造函數的2個參數。但是如果我不通過R.layout.rowlayout作爲參數在構造函數中,getView如何知道誰是ViewGroup parent?我的意思是,必須調用getView,並且父對象必須傳遞給它。但是班級如何知道誰是家長?

另外,Android的頁面指示我這樣稱呼它:

MyArrayAdapter<String> adapter = new MyArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, myStringArray); 

但我最終不得不採取<String>,並擱置這樣的:

MyArrayAdapter adapter = new MyArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, myStringArray); 

爲什麼?

是否因爲文章擴展了課程而未使用<String>?就像這樣:

public class MyArrayAdapter extends ArrayAdapter<String> { 

而且,由於我重寫類,爲什麼我需要調用使用super原來的構造?

回答

0

我想你誤解了一些基本概念。首先,ArrayAdapter需要3個構造函數參數,從它繼承的類可以有任意多個。此外,您將列表項的資源ID傳遞給它,而不是來自父項的資源ID。

ArrayAdapter的基本思路是這樣的:

public class MyArrayAdapter extends ArrayAdapter<String> { 

    public MyArrayAdapter(Context context, String[] values) { 
     super(context, R.layout.rowlayout, values); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView = super.getView(position, convertView, parent); 
     ... 

     return rowView; 
    } 
} 

ArrayAdapter.getView()將返回傳遞給構造佈局的一個實例。其次:適配器連接到ListViewListView知道包含列表的視圖的佈局,因此知道每行的父視圖。 ListView也是在適配器上調用getView()的那個。只需在getView中添加一箇中斷點,您就可以看到誰在調用它。

0

在進步,,

即使你創建一個MyArrayAdapter對象,也不會在這個類中,直到你將此作爲一個對你ListView參考適配器執行任何方法。因此,這個ViewGroup parent即將來自ListView引用,從而根據父參數相應地膨脹元素(父將是listview)。

如果您要爲ListView中的每個元素使用完全不同的自定義佈局,則不需要將資源ID傳遞給適配器。

public MyArrayAdapter(Context context, String[] values) { 
     super(context, 0, values); 
     this.context = context; 

     this.values = values; 
    } 

,因爲現在你正在使用你的元素自定義佈局,而你對你膨脹然後像使用以下,

 LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.rowlayout, parent, false); 

現在到了棘手的部分。

如果你真的打算從你的構造函數傳遞RESOURCEID,

如下

 public MyArrayAdapter(Context context, int resourceid, String[] values) { 
      super(context, 0, values);// 0 is just a filler here, 
      this.context = context; 
      this.resourceid= resourceid; 
      this.values = values; 
     } 

您的自定義類是要我更通用的(這無關與Android)

因爲,

你可以在這裏使用它,

  LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View rowView = inflater.inflate(this.resourceid, parent, false); 

您還應該閱讀this回答掌握ArrayAdapter的想法。

編輯:

我沒有看到來了, 不要錯過了解以下

this.parent = resourceid; 

用,

public View getView(int position, View convertView, ViewGroup parent) { 

父。

有從超resourceid(basiclly沒有關係)的超級構造函數做的ViewGroup parent推導,當ListView基準設置與適配器這ViewGroup parent即將到來的形式ListView

相關問題