convertView.FindViewById returns adapter.GetView 中为空
convertView.FindViewById returns null in adapter.GetView
我试图在 android 应用程序中显示日志项列表,但是每当我调用 convertView.FindViewByID 时,我都会收到 NullReferenceException。根据调试器,布局使用正确数量的子视图正确膨胀,但我无法使用 FindViewById 获取任何子视图。
我的解决方案分布在几个项目中,但适配器(和包含视图)和布局都在同一个项目中。这个项目不是启动项目,但到目前为止这还没有问题。
我已确保引用了正确的布局文件,据我所知已检查布局的格式是否正确,并且已仔细检查 ID 和类型我所引用的观点。看起来一切正常。
我还在 Google 上查看了大约 3-4 页的搜索结果,里面全是类似问题的答案,但其中 none 对我有用。我无权访问 OnFinishInflate 方法,并且我已经绝对确定它是正确的布局并且 ID 是正确的。我还进行了检查以确保没有 ID 重复。该布局在解决方案的其他任何地方都不存在,布局文件中的 ID 的 none 也存在于其他任何地方。本质上,根据我的发现,其他解决方案要么是我已经在做的事情,要么是不适用的,因为我是在适配器的 GetView 方法中执行此操作,而不是在片段或 activity.[=15 中执行此操作=]
要显示的项目列表正确填充,并且具有预期的项目数量和类型。
这是 GetView 方法:
public override View GetView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = _activity.LayoutInflater.Inflate(Resource.Layout.startLogListItem, null, false);
}
var log = _logsEntries[position];
var image = convertView.FindViewById<ImageView>(Resource.Id.startLogListItem_imageView1); //returns null
image.SetImageResource(Resource.Drawable.icon_info); //throws NullReferenceException
convertView.FindViewById<TextView>(Resource.Id.startLogListItem_txtMessage).Text = log.Name;
convertView.FindViewById<TextView>(Resource.Id.startLogListItem_txtDateTime).Text = log.Date.ToShortTimeString();
convertView.FindViewById<TextView>(Resource.Id.startLogListItem_txtTimespan).Text = log.Duration.ToReadableShortString();
return convertView;
}
这是布局文件的内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:src="@android:drawable/ic_menu_gallery"
android:layout_width="32dp"
android:layout_height="32dp"
android:paddingLeft="2dp"
android:layout_gravity="center_vertical"
android:id="@+id/startLogListItem.imageView1" />
<LinearLayout
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:paddingLeft="4dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout2">
<LinearLayout
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/linearLayout3">
<TextView
android:text="Label Label Label"
android:layout_width="wrap_content"
android:textColor="#000"
android:layout_height="wrap_content"
android:id="@+id/startLogListItem.txtMessage" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout4">
<TextView
android:text="17.35"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#393939"
android:textSize="12sp"
android:fontFamily="sans-serif-light"
android:layout_weight="1"
android:id="@+id/startLogListItem.txtDateTime"
android:paddingRight="20dp" />
<TextView
android:text="17.35"
android:layout_width="wrap_content"
android:textColor="#393939"
android:textSize="12sp"
android:fontFamily="sans-serif-light"
android:layout_height="wrap_content"
android:layout_weight="2"
android:id="@+id/startLogListItem.txtTimespan" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
每当我调用 convertView.FindViewById 时,它 returns 为 null 并且任何尝试对其中一个子视图进行赋值都会引发 NullReferenceException。
据我所知,您必须将其分开,这是 xml:
中的那个
android:id="@+id/startLogListItem.imageView1"
而您要搜索的是:
convertView.FindViewById<ImageView>(Resource.Id.startLogListItem_imageView1);
当它们匹配时它应该起作用!!!
包含.
的布局中的id无效,您可以尝试将.
替换为_
例如,
替换
android:id="@+id/startLogListItem.txtMessage"
和
android:id="@+id/startLogListItem_txtMessage"
其他包含.
.
的id也是如此
终于找到问题的原因并解决了。
问题出在 ID 上,但不是我预期的方式,甚至我都知道这可能是个问题。问题是 ID 以小写字母开头,而不是大写字母。从小写字母更改为大写字母解决了这个问题。由于某种原因,小写 "s" 不起作用,但小写 "a" 可以。我最初怀疑这可能与 ID 的限制有关,但我们离 ID 资源的大约 65000 个限制还差得很远。
但无论如何,将第一个字母改为大写 S 为我们解决了这个问题。
我试图在 android 应用程序中显示日志项列表,但是每当我调用 convertView.FindViewByID 时,我都会收到 NullReferenceException。根据调试器,布局使用正确数量的子视图正确膨胀,但我无法使用 FindViewById 获取任何子视图。
我的解决方案分布在几个项目中,但适配器(和包含视图)和布局都在同一个项目中。这个项目不是启动项目,但到目前为止这还没有问题。
我已确保引用了正确的布局文件,据我所知已检查布局的格式是否正确,并且已仔细检查 ID 和类型我所引用的观点。看起来一切正常。
我还在 Google 上查看了大约 3-4 页的搜索结果,里面全是类似问题的答案,但其中 none 对我有用。我无权访问 OnFinishInflate 方法,并且我已经绝对确定它是正确的布局并且 ID 是正确的。我还进行了检查以确保没有 ID 重复。该布局在解决方案的其他任何地方都不存在,布局文件中的 ID 的 none 也存在于其他任何地方。本质上,根据我的发现,其他解决方案要么是我已经在做的事情,要么是不适用的,因为我是在适配器的 GetView 方法中执行此操作,而不是在片段或 activity.[=15 中执行此操作=]
要显示的项目列表正确填充,并且具有预期的项目数量和类型。
这是 GetView 方法:
public override View GetView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = _activity.LayoutInflater.Inflate(Resource.Layout.startLogListItem, null, false);
}
var log = _logsEntries[position];
var image = convertView.FindViewById<ImageView>(Resource.Id.startLogListItem_imageView1); //returns null
image.SetImageResource(Resource.Drawable.icon_info); //throws NullReferenceException
convertView.FindViewById<TextView>(Resource.Id.startLogListItem_txtMessage).Text = log.Name;
convertView.FindViewById<TextView>(Resource.Id.startLogListItem_txtDateTime).Text = log.Date.ToShortTimeString();
convertView.FindViewById<TextView>(Resource.Id.startLogListItem_txtTimespan).Text = log.Duration.ToReadableShortString();
return convertView;
}
这是布局文件的内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:src="@android:drawable/ic_menu_gallery"
android:layout_width="32dp"
android:layout_height="32dp"
android:paddingLeft="2dp"
android:layout_gravity="center_vertical"
android:id="@+id/startLogListItem.imageView1" />
<LinearLayout
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:paddingLeft="4dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout2">
<LinearLayout
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/linearLayout3">
<TextView
android:text="Label Label Label"
android:layout_width="wrap_content"
android:textColor="#000"
android:layout_height="wrap_content"
android:id="@+id/startLogListItem.txtMessage" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout4">
<TextView
android:text="17.35"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#393939"
android:textSize="12sp"
android:fontFamily="sans-serif-light"
android:layout_weight="1"
android:id="@+id/startLogListItem.txtDateTime"
android:paddingRight="20dp" />
<TextView
android:text="17.35"
android:layout_width="wrap_content"
android:textColor="#393939"
android:textSize="12sp"
android:fontFamily="sans-serif-light"
android:layout_height="wrap_content"
android:layout_weight="2"
android:id="@+id/startLogListItem.txtTimespan" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
每当我调用 convertView.FindViewById 时,它 returns 为 null 并且任何尝试对其中一个子视图进行赋值都会引发 NullReferenceException。
据我所知,您必须将其分开,这是 xml:
中的那个android:id="@+id/startLogListItem.imageView1"
而您要搜索的是:
convertView.FindViewById<ImageView>(Resource.Id.startLogListItem_imageView1);
当它们匹配时它应该起作用!!!
包含.
的布局中的id无效,您可以尝试将.
替换为_
例如,
替换
android:id="@+id/startLogListItem.txtMessage"
和
android:id="@+id/startLogListItem_txtMessage"
其他包含.
.
终于找到问题的原因并解决了。
问题出在 ID 上,但不是我预期的方式,甚至我都知道这可能是个问题。问题是 ID 以小写字母开头,而不是大写字母。从小写字母更改为大写字母解决了这个问题。由于某种原因,小写 "s" 不起作用,但小写 "a" 可以。我最初怀疑这可能与 ID 的限制有关,但我们离 ID 资源的大约 65000 个限制还差得很远。
但无论如何,将第一个字母改为大写 S 为我们解决了这个问题。