在ListView自定义Adapter中调用SetBackgroundResource报错求助
你的问题回顾
你尝试给自定义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/目录下完全符合要求,所以能正常加载使用。
两种正确的实现方式
方式一:用颜色状态列表(更简洁)
如果只是单纯切换背景颜色,不需要复杂的形状,推荐用这种方式:
- 把你最初写的颜色选择器文件移动到
res/color/目录(如果没有这个目录,直接新建一个) - 在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

