[英]Can't set text or drawable because of unresolved references in Kotlin
我是 Kotlin 的新手,我尝试通过使用此 Java 指南在其上编写简单的应用程序启动器来学习它: Z5E056C500A1C4B6A7110B50D807BADE-5Z://laller-program/so farcreate-5Z://laller-program/so farcreate-5Z://laller-program/so farcreate有一些“未解决的引用”错误,我知道我做错了什么,但无法弄清楚究竟是什么,因为我不太了解 Kotlin 语法。 我可能已经尝试了我在 Google 中找到的所有内容,以及到处重写代码。 似乎新手经常遇到我的问题,而且 StackOverflow 上有很多类似的问题。
所以这里有错误:
viewHolder.icon.setImageDrawable(appInfo.icon) // Unresolved reference: icon
viewHolder.label.text = appInfo.label // Unresolved reference: label
viewHolder.name.text = appInfo.name // Unresolved reference: name
这是整个 MainActivity class:
class MainActivity : AppCompatActivity() {
var apps: List<AppInfo>? = null
private var gridView: GridView? = null
private var adapter: ArrayAdapter<AppInfo>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadApps()
loadListView()
addGridListeners()
}
private fun loadApps() {
val packageManager = packageManager
if (apps == null) {
apps = ArrayList()
val i = Intent(Intent.ACTION_MAIN, null)
i.addCategory(Intent.CATEGORY_LAUNCHER)
val availableApps: List<ResolveInfo> = packageManager.queryIntentActivities(i, 0)
for (ri in availableApps) {
val appinfo = AppInfo()
appinfo.label = ri.loadLabel(packageManager)
appinfo.name = ri.activityInfo.packageName
appinfo.icon = ri.activityInfo.loadIcon(packageManager)
(apps as ArrayList<AppInfo>).add(appinfo)
}
}
}
private fun addGridListeners() {
val packageManager = packageManager
gridView!!.onItemClickListener = OnItemClickListener { adapterView, view, i, l ->
val intent: Intent? = packageManager.getLaunchIntentForPackage(apps!![i].name.toString())
this@MainActivity.startActivity(intent)
}
}
private fun loadListView() {
gridView = findViewById(R.id.gridview)
if (adapter == null) {
adapter = object : ArrayAdapter<AppInfo>(this, R.layout.apps_view, apps!!) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var convertView = convertView
val viewHolder: Any?
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.apps_view, parent, false)
viewHolder = ViewHolderItem()
viewHolder.icon = convertView.findViewById(R.id.img_icon)
viewHolder.name = convertView.findViewById(R.id.txt_name)
viewHolder.label = convertView.findViewById(R.id.txt_label)
convertView.tag = viewHolder
} else {
viewHolder = convertView.tag
}
val appInfo = apps!![position]
viewHolder.icon.setImageDrawable(appInfo.icon)
viewHolder.label.text = appInfo.label
viewHolder.name.text = appInfo.name
return convertView!!
}
inner class ViewHolderItem {
var icon: ImageView? = null
var label: TextView? = null
var name: TextView? = null
}
}
}
gridView!!.adapter = adapter
}
}
这是 activity_main.xml 以防需要:
<?xml version="1.0" encoding="utf-8"?>
<GridView android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:layout_weight="5"
android:background="#000"
android:horizontalSpacing="1dp"
android:verticalSpacing="1dp"
android:numColumns="4"
xmlns:android="http://schemas.android.com/apk/res/android" />
这是 AppInfo class:
class AppInfo {
var label: CharSequence? = null
var name: CharSequence? = null
var icon: Drawable? = null
}
这是apps_view.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:orientation="vertical"
android:padding="10dp">
<ImageView
android:id="@+id/img_icon"
android:layout_width="70dp"
android:layout_height="50dp"
android:gravity="center_horizontal" />
<TextView
android:id="@+id/txt_label"
android:layout_width="70dp"
android:layout_height="40dp"
android:gravity="center_horizontal"
android:textColor="#361b1b"
android:textStyle="bold" />
<TextView
android:id="@+id/txt_name"
android:layout_width="0dp"
android:layout_height="0dp"
android:textColor="#fff"
android:textSize="0sp"
android:textStyle="bold" />
</LinearLayout>
希望很清楚。 我误解了什么?
由于这一行,您有一个未解决的参考错误:
val viewHolder: Any?
这里viewHolder
有类型Any?
例如,当您引用label
属性viewHolder.label
时,它会显示错误,因为Any
没有此类属性。
要解决此问题,请使用ViewHolderItem
类型的viewHolder
:
val viewHolder: ViewHolderItem
问题是 ViewHolderItem 是一个内部 class,它的字段不能从外部 class 访问。 用于在 kotlin 中创建 model class 使用数据 class
data class ViewHolderItem(val p1 : String, val p2 : Int, ...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.