我正在尝试使用自定义适配器(没有视图固定器)创建列表视图。我想将图像插入到我的自定义列表视图中。
我最终得到了这一行代码:
class CategoryAdapter(context: Context, categories: List<Category>) : BaseAdapter(){
val context = context
val categories = categories
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val categoryView: View
categoryView = LayoutInflater.from(context).inflate(R.layout.category_list_item, null)
val categoryImage : ImageView = categoryView.findViewById(R.id.imageView2)
val categoryName : TextView = categoryView.findViewById(R.id.textView2)
val category = categories[position]
val resourceId = context.resources.getIdentifier(category.image, "drawable", context.packageName)
categoryImage.setImageResource(resourceId)
categoryName.text = category.title
return categoryView
}
override fun getItem(position: Int): Any {
return categories[position]
}
override fun getItemId(position: Int): Long {
return 0
}
override fun getCount(): Int {
return categories.count()
}}
这完全正常。我对下一行的工作方式一无所知。
val resourceId = context.resources.getIdentifier(category.image, "drawable", context.packageName)
你能解释一下我的代码吗?
答案 0 :(得分:0)
您要使用:
在Android中动态检索资源
通常,在代码中检索资源(图纸,字符串,您拥有的东西)时,您会使用自动生成的R.java来实现。但是,我最近在我的应用程序中,其中ImageView中的项旁边有一个不同的图标。所有这些数据都以Image的形式存储在drawable中,这意味着我无法将数据链接到R.java。
尽管如此,我仍然需要某种方法来保留Drawable的名称,因此我首先转向getResources().getIdentifier()
。此方法可以很好地在任何包中找到所需内容的资源ID:
基于此Blog。
类似:
if (cnt == 7) {
cnt = 1;
}
int resID = getResources().getIdentifier("ad_banner" + cnt, "drawable", getPackageName());
activityTwillioCallBinding.imgAdView.setImageResource(resID);
cnt++;
这一切都很好。
getResources()
为应用程序的包返回一个Resources实例。
公共int getIdentifier(字符串名称,字符串defType,字符串defPackage)
返回给定资源名称的资源标识符。完全限定的资源名称的格式为“ package:type / entry”。如果分别在此处指定了defType和defPackage,则前两个组件(package和type)是可选的。
注意:不鼓励使用此功能。按标识符检索资源比按名称检索资源要有效得多。
参数
name字符串:所需资源的名称。
defType字符串:如果名称中不包含“ type /”,则为查找的可选默认资源类型。可以为null,以要求使用显式类型。
defPackage字符串:如果名称中未包含“ package:”,则为查找的可选默认软件包。可以为null,以要求使用显式包。
返回 int int关联的资源标识符。如果找不到这样的资源,则返回0。 (0不是有效的资源ID。)