【问题标题】:convertView.FindViewById returns null in adapter.GetViewconvertView.FindViewById 在 adapter.GetView 中返回 null
【发布时间】:2020-01-11 23:25:18
【问题描述】:

我正在尝试在 Android 应用程序中显示日志项列表,但是每当我调用 convertView.FindViewByID 时,我都会收到 NullReferenceException。根据调试器,布局使用正确数量的子视图正确膨胀,但我无法使用 FindViewById 获取任何子视图。

我的解决方案分布在几个项目中,但适配器(和包含视图)和布局都在同一个项目中。这个项目不是启动项目,但到目前为止还没有问题。

我已确保我引用了正确的布局文件,据我所知,我已经检查了布局没有不正确地形成,并且我已经仔细检查了 ID 和类型我引用的观点。一切看起来都正确。

我还在 Google 上查看了大约 3-4 页的搜索结果,里面充满了类似问题的答案,但没有一个适合我。我无权访问 OnFinishInflate 方法,并且我绝对确定它是正确的布局并且 ID 是正确的。我还检查以确保没有重复的 ID。该布局在解决方案的其他任何地方都不存在,并且布局文件中的任何 ID 都不存在于其他任何地方。从本质上讲,根据我的发现,其他解决方案要么是我已经在做的事情,要么不适用,因为我是在适配器的 GetView 方法中执行此操作,而不是在片段或活动中。

要显示的项目列表正确填充,并具有预期的项目数量和类型。

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 时,它都会返回 null,任何尝试分配给其中一个子视图都会引发 NullReferenceException。

【问题讨论】:

    标签: android android-layout xamarin android-listview baseadapter


    【解决方案1】:

    布局中包含.的id无效,可以尝试将.替换为_ 例如,

    替换

      android:id="@+id/startLogListItem.txtMessage"
    

     android:id="@+id/startLogListItem_txtMessage"
    

    对于包含.的其他id也是如此。

    【讨论】:

    • 这非常接近正确答案。您绝对正确,句号无效,我们在您发布答案前大约 20 分钟发现了这一点。不幸的是,下划线似乎也无效。至少,它给出了同样的错误。但是,将 ID 更改为更短时,它可以工作。简单地删除句点也是不够的,所以现在我猜它可能与 ID 长度有关。
    • 没关系,原来ID的第一个字母必须是大写字母,而不是小写字母。
    【解决方案2】:

    据我所知,您必须有两个单独的 id 是 xml 中的一个:

    android:id="@+id/startLogListItem.imageView1"
    

    你正在寻找的那个:

    convertView.FindViewById<ImageView>(Resource.Id.startLogListItem_imageView1); 
    

    当它们匹配时,它应该可以工作!!!

    【讨论】:

    • 这是因为在生成Resources文件时第一个ID变成了第二个ID。即使第一个 ID 与第二个完全匹配,我仍然会收到错误消息。生成资源文件时,ID 中的句点会变成下划线。我已经在项目的其他多个地方完成了这项工作,并且在所有这些地方都有效。不幸的是,这不是问题。为了更好地衡量,我尝试更改布局文件中的 ID,但仍然产生相同的错误。如果这是问题所在,Visual Studio 也会在编译后将其标记为错误。
    • 你检查孩子的convertView了吗?你的图片在吗?
    • convertView 有 2 个孩子,正如布局所预期的那样。我不能确切地检查孩子们是什么,至少我还没有找到办法做到这一点。图像存在,是的。图片绝对不是问题。如果我注释掉图像行,我会在尝试设置 textview 的文本时得到相同的 NullReferenceException。
    【解决方案3】:

    我终于找到了问题的原因并解决了它。

    问题出在 ID 上,但不是我预期的,甚至不是我知道的问题。问题是 ID 以小写字母开头,而不是大写字母。从小写字母更改为大写字母解决了这个问题。出于某种原因,小写“s”不起作用,但小写“a”很好。我最初怀疑这可能与 ID 的限制有关,但我们离 ID 资源的大约 65000 个限制还差得很远。

    但无论如何,将第一个字母改为大写 S 为我们解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-30
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2015-12-18
      • 2017-02-23
      • 2019-08-03
      相关资源
      最近更新 更多