为什么 Android 设备上未显示 WeekDay 对象列表? Kotlin 列表视图
Why list of WeekDay objects isn't displayed on Android device? Kotlin ListView
我正在写我的第一个 Android 规划申请。
我有一个导航抽屉和一个 WeekListFragment。在片段中,我创建了一个 WeekDay 对象数组,并尝试通过 WeekAdapter 显示它们。但是当我 运行 Android 模拟器时,尽管片段打开,但什么也没有显示。你能解释一下我应该怎么做吗?
这里是这个片段的代码:
package itshpit.com.myapplication
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import itshpit.com.myapplication.classes.WeekDay
class WeekListFragment() : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view: View? = inflater.inflate(R.layout.fragment_week, container, false)
(activity as MainActivity).supportActionBar!!.title = "Week"
val week: Array<String> = resources.getStringArray(R.array.week)
val weekList: ArrayList<WeekDay> = ArrayList()
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 1))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 2))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 3))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 4))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 5))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 6))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 7))
val adapter = WeekAdapter((activity as MainActivity), weekList)
return view
}
class WeekAdapter(context: Context, val weekList: List<WeekDay>) : ArrayAdapter<WeekDay>(context, 0, weekList) {
private class ViewHolder(row: View?) {
var txtName: TextView
var ivImage: ImageView
init {
this.txtName = row?.findViewById(R.id.txtWeekDay) as TextView
this.ivImage = row.findViewById(R.id.imgWeekDay) as ImageView
}
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view: View?
val viewHolder: ViewHolder
if (convertView == null) {
val layout = LayoutInflater.from(context)
view = layout.inflate(R.layout.week_item, parent, false)
viewHolder = ViewHolder(view)
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolder
}
val weekDay: WeekDay = getItem(position) as WeekDay
viewHolder.txtName.text = weekDay.text
viewHolder.ivImage.setImageResource(weekDay.image)
return view as View
}
override fun getItemId(position: Int): Long {
return weekList[position].id
}
override fun getItem(position: Int): WeekDay? {
return weekList.get(position)
}
override fun getCount(): Int {
return 7
}
}
}
WeekDay class 代码如下:
data class WeekDay(var id: Long = -1,
var date: Date? = null,
var text: String,
var image: Int
) {}
"fragment_week.xml" 文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WeekListFragment">
<ListView
android:id="@+id/weekList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
您从未将适配器分配给 ListView。
首先您需要引用您的 ListView。将其放在 return 行之前:
val weekList: ListView = findViewById(R.id.weekList)
请注意,如果使用 Kotlin Android 扩展(新 Android 项目默认执行),则不需要此步骤。 Kotlin Android 扩展自动为您的视图 ID 生成属性。
然后调用删除现有的 val adapter = ...
行并执行此操作:
weekList.adapter = WeekAdapter(context, weekList)
注意我将 (activity as MainActivity)
更改为 context
。这是因为您的适配器只在其构造函数中请求 context
。
我正在写我的第一个 Android 规划申请。 我有一个导航抽屉和一个 WeekListFragment。在片段中,我创建了一个 WeekDay 对象数组,并尝试通过 WeekAdapter 显示它们。但是当我 运行 Android 模拟器时,尽管片段打开,但什么也没有显示。你能解释一下我应该怎么做吗?
这里是这个片段的代码:
package itshpit.com.myapplication
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import itshpit.com.myapplication.classes.WeekDay
class WeekListFragment() : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view: View? = inflater.inflate(R.layout.fragment_week, container, false)
(activity as MainActivity).supportActionBar!!.title = "Week"
val week: Array<String> = resources.getStringArray(R.array.week)
val weekList: ArrayList<WeekDay> = ArrayList()
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 1))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 2))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 3))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 4))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 5))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 6))
weekList.add(WeekDay(text = "some Text", image = R.drawable.mon, id = 7))
val adapter = WeekAdapter((activity as MainActivity), weekList)
return view
}
class WeekAdapter(context: Context, val weekList: List<WeekDay>) : ArrayAdapter<WeekDay>(context, 0, weekList) {
private class ViewHolder(row: View?) {
var txtName: TextView
var ivImage: ImageView
init {
this.txtName = row?.findViewById(R.id.txtWeekDay) as TextView
this.ivImage = row.findViewById(R.id.imgWeekDay) as ImageView
}
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view: View?
val viewHolder: ViewHolder
if (convertView == null) {
val layout = LayoutInflater.from(context)
view = layout.inflate(R.layout.week_item, parent, false)
viewHolder = ViewHolder(view)
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolder
}
val weekDay: WeekDay = getItem(position) as WeekDay
viewHolder.txtName.text = weekDay.text
viewHolder.ivImage.setImageResource(weekDay.image)
return view as View
}
override fun getItemId(position: Int): Long {
return weekList[position].id
}
override fun getItem(position: Int): WeekDay? {
return weekList.get(position)
}
override fun getCount(): Int {
return 7
}
}
}
WeekDay class 代码如下:
data class WeekDay(var id: Long = -1,
var date: Date? = null,
var text: String,
var image: Int
) {}
"fragment_week.xml" 文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WeekListFragment">
<ListView
android:id="@+id/weekList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
您从未将适配器分配给 ListView。
首先您需要引用您的 ListView。将其放在 return 行之前:
val weekList: ListView = findViewById(R.id.weekList)
请注意,如果使用 Kotlin Android 扩展(新 Android 项目默认执行),则不需要此步骤。 Kotlin Android 扩展自动为您的视图 ID 生成属性。
然后调用删除现有的 val adapter = ...
行并执行此操作:
weekList.adapter = WeekAdapter(context, weekList)
注意我将 (activity as MainActivity)
更改为 context
。这是因为您的适配器只在其构造函数中请求 context
。