You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ListView自定义Adapter中调用SetBackgroundResource报错求助

自定义ListView行背景状态色的正确实现方式

你的问题回顾

你尝试给自定义ListView的Adapter列表行设置带状态的背景色,最初写了一个颜色选择器artists_list_backgroundcolor.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" android:state_pressed="false" android:color="#6495ED" />
<item android:state_pressed="true" android:color="#ffffff" />
<item android:state_selected="true" android:state_pressed="false" android:color="#E5F5FA" />
</selector>

然后在Adapter的GetView方法里用row.SetBackgroundResource(Resource.Drawable.artists_list_backgroundcolor)设置背景,结果启动Activity时抛出了Android.Content.Res.Resources+NotFoundException错误。只有改成包含<shape>的Drawable选择器才能正常运行,你想确认这种方式是否正确。

问题出在哪?

你最开始写的是颜色状态列表(Color State List),这类资源文件应该放在res/color/目录下,而不是res/drawable/。SetBackgroundResource()方法是用来加载Drawable资源的,直接引用颜色选择器会因为资源类型不匹配,导致系统找不到对应的资源,所以报错。

而你后来改成的是Drawable状态选择器,里面用<shape>包裹颜色,属于Drawable资源范畴,放在res/drawable/目录下完全符合要求,所以能正常加载使用。

两种正确的实现方式

方式一:用颜色状态列表(更简洁)

如果只是单纯切换背景颜色,不需要复杂的形状,推荐用这种方式:

  1. 把你最初写的颜色选择器文件移动到res/color/目录(如果没有这个目录,直接新建一个)
  2. 在Adapter的GetView方法里,用以下代码设置背景:
// 获取颜色状态列表
ColorStateList colorStateList = Resources.GetColorStateList(Resource.Color.artists_list_backgroundcolor);
// 设置背景的色调列表,让背景跟随视图状态变化
row.BackgroundTintList = colorStateList;

这样就能实现按下、选中、默认状态的颜色切换,代码更简洁。

方式二:用Drawable状态选择器(你当前的方式)

这种方式是完全正确的,而且扩展性更强——如果之后你需要给背景加圆角、边框或者渐变效果,都可以在<shape>里配置。你可以把所有状态补充完整,还原你最初的需求:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid android:color="#ffffff" />
        </shape>
    </item>
    <item android:state_selected="true" >
        <shape>
            <solid android:color="#E5F5FA" />
        </shape>
    </item>
    <!-- 默认状态 -->
    <item>
        <shape>
            <solid android:color="#6495ED" />
        </shape>
    </item>
</selector>

然后继续用row.SetBackgroundResource(Resource.Drawable.artists_list_backgroundcolor)设置即可,完全没问题。

总结

你后来采用的Drawable选择器方式是正确的实现方式,同时也可以根据需求选择更简洁的颜色状态列表方式。两种方式都能满足你的需求,就看你是否需要扩展背景样式啦。

内容的提问来源于stack exchange,提问作者testsc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:19:03