2015-09-04 88 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

相关问题