繁体   English   中英

谁在ArrayAdapter中调用getView()?

[英]Who calls getView() in ArrayAdapter?

我正在为ListView编写自己的适配器,但是在某些概念上遇到了麻烦。 首先,这就是我写的:

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作为参数,因为此页面告诉我必须使用3个参数。 然而,在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调用原始构造函数?

我认为您误解了一些基本概念。 首先, 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()将返回传递给构造函数的布局实例。

其次:适配器连接到ListView ListView知道包含列表的视图的布局,因此知道每一行的父视图。 ListView也是在适配器上调用getView()的列表。 只需在getView中添加一个断点,就可以看到谁在调用它。

进行中,,

即使创建了MyArrayAdapter对象,它也不会执行此类中的任何方法,除非您在ListView引用上MyArrayAdapter对象设置为适配器。 因此,此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;
        }

您的Custom类对我来说更通用(与android无关)

因为,

你可以在这里使用

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

您还应该阅读答案,以掌握ArrayAdapter的思想。

编辑:

我没有看到即将到来,请不要错过以下内容

this.parent = resourceid;

与,

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

父母

有做衍生ViewGroup parent从超resourceid (basiclly没有关系)的超级构造函数,这ViewGroup parent快到形式ListViewListView基准设置与适配器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM