Android ListView项目何时绘制到屏幕上

Android ListView项目何时绘制到屏幕上,android,android-layout,listview,Android,Android Layout,Listview,我想知道什么时候创建ListView布局。我需要在项目视图上执行一个操作,因为我需要知道布局何时被绘制到屏幕上。我需要获取已创建视图的ID 有没有办法知道这是什么时候完成的 编辑(精度): 在ListView之后调用notifyDataSetChanged不起作用,ListView.getChildCount仍然返回0 我显示有限数量的项目,所有项目都显示在屏幕上 适配器需要为列表的每一行创建布局。ListView实例为每个数据元素调用适配器上的getView()方法。在此方法中,适配器创建行

我想知道什么时候创建
ListView
布局。我需要在项目视图上执行一个操作,因为我需要知道布局何时被绘制到屏幕上。我需要获取已创建视图的ID

有没有办法知道这是什么时候完成的

编辑(精度):

  • ListView之后调用notifyDataSetChanged
    不起作用,
    ListView.getChildCount
    仍然返回
    0
  • 我显示有限数量的项目,所有项目都显示在屏幕上

适配器需要为列表的每一行创建布局。
ListView
实例为每个数据元素调用适配器上的
getView()
方法。在此方法中,适配器创建行布局并将数据映射到布局中的视图

getView()
方法中,您可以展开基于XML的布局,然后根据此行的Java对象设置各个视图的内容。要扩展XML布局文件,可以使用
LayoutInflator
系统服务

下面是
Listveiw
的适配器示例

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

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

        public MySimpleArrayAdapter(Context context, String[] values) {
                super(context, -1, values);
                this.context = context;
                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(values[position]);
                // change the icon for Windows and iPhone
                String s = values[position];
                if (s.startsWith("iPhone")) {
                        imageView.setImageResource(R.drawable.no);
                } else {
                        imageView.setImageResource(R.drawable.ok);
                }

                return rowView;
        }
}

适配器需要为列表的每一行创建布局。
ListView
实例为每个数据元素调用适配器上的
getView()
方法。在此方法中,适配器创建行布局并将数据映射到布局中的视图

getView()
方法中,您可以展开基于XML的布局,然后根据此行的Java对象设置各个视图的内容。要扩展XML布局文件,可以使用
LayoutInflator
系统服务

下面是
Listveiw
的适配器示例

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

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

        public MySimpleArrayAdapter(Context context, String[] values) {
                super(context, -1, values);
                this.context = context;
                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(values[position]);
                // change the icon for Windows and iPhone
                String s = values[position];
                if (s.startsWith("iPhone")) {
                        imageView.setImageResource(R.drawable.no);
                } else {
                        imageView.setImageResource(R.drawable.ok);
                }

                return rowView;
        }
}

为了从视图中获取所有ID,我尝试了以下方法

private List<View> mChildren;
然后可以创建包含所有子视图的
mChildren
。另外,您也可以选中。希望有帮助:)

更新
当我和Thomas在聊天中讨论时,我回想起来,视图添加的
onViewAdded
(来自API 23)也很有用。

为了从视图中获取所有ID,我尝试了以下方法

private List<View> mChildren;
然后可以创建包含所有子视图的
mChildren
。另外,您也可以选中。希望有帮助:)

更新
当我和Thomas在聊天中讨论时,我回想起来,添加的
onViewAdded
(来自API 23)也很有用。

我认为每个项目都是在适配器设置时创建的。阅读本教程,您将在其中获得所有详细信息。我想我很清楚
列表视图的工作原理。我尝试在
notifyDataSetChange
后执行此操作,但GridView的子计数仍然为0。我将看一看这些教程nonetheless@ThomasRoulin不会同时创建所有项目(只有少量项目且几乎所有项目都同时显示在屏幕上的情况除外)。
ListView
正在重新使用子视图:如果一次可以看到10个项目,则只会创建十几个子视图。我认为每个项目都是在适配器设置时创建的。阅读本教程,您将在其中获得所有详细信息。我想我很清楚
列表视图的工作原理。我尝试在
notifyDataSetChange
后执行此操作,但GridView的子计数仍然为0。我将看一看这些教程nonetheless@ThomasRoulin不会同时创建所有项目(只有少量项目且几乎所有项目都同时显示在屏幕上的情况除外)。
ListView
正在重新使用子视图:如果一次可以看到10个项目,那么只会创建十几个子视图。这并不能回答我的问题,对吗?我知道如何制作
列表视图
请相应地更新您的问题,您的问题是“我想知道列表视图布局何时创建。我需要知道布局何时绘制到屏幕”。请具体回答你的问题。所以我们可以帮助您找到正确的解决方案。不是答案,但仍然+1的努力:)这并没有回答我的问题,对吗?我知道如何制作
列表视图
请相应地更新您的问题,您的问题是“我想知道列表视图布局何时创建。我需要知道布局何时绘制到屏幕”。请具体回答你的问题。所以我们可以帮助您找到正确的解决方案。不是答案,但仍然+1的努力:)