【发布时间】:2022-09-24 03:00:13
【问题描述】:
我正在开发一个 Todo-list 作为 Android 应用程序以开始使用 Kotlin,但我遇到了问题,即我的 TodoAdapter 类(据我所知,它应该定义如何在回收站视图中处理所述 Todos ?) 由于某种原因,不能从 ListAdapter 类继承。
在我尝试通过保存到一个简单的 .txt 文件作为开始来为我的应用程序添加持久性之前,我相信我没有遇到问题。请在下面查看我的代码并帮助我修复我的代码。
我的 TodoAdapter 类:
class TodoAdapter (
private val todos: MutableList<Todo>
) : ListAdapter<Todo,TodoAdapter.TodoViewHolder>() {
class TodoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
return TodoViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_todo,
parent,
false
)
)
}
fun addTodo(todo: Todo) {
todos.add(todo)
notifyItemInserted(todos.size - 1)
}
fun deleteDoneTodos() {
todos.removeAll { todo ->
todo.isChecked
}
notifyDataSetChanged()
}
private fun toggleStrikeThrough(tvTodoTitle: TextView, isChecked: Boolean) {
if (isChecked) {
tvTodoTitle.paintFlags = tvTodoTitle.paintFlags or STRIKE_THRU_TEXT_FLAG
} else{
tvTodoTitle.paintFlags = tvTodoTitle.paintFlags and STRIKE_THRU_TEXT_FLAG.inv()
}
}
override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
val curTodo = todos[position]
holder.itemView.apply {
tvTodoTitle.text = curTodo.title //Hier stimmt etwas nicht: tvTodoTitle Import fehlt???
cbDone.isChecked = curTodo.isChecked
toggleStrikeThrough(tvTodoTitle, curTodo.isChecked)
cbDone.setOnCheckedChangeListener{ _, isChecked ->
toggleStrikeThrough(tvTodoTitle, isChecked)
curTodo.isChecked = !curTodo.isChecked
}
}
}
override fun getItemCount(): Int {
return todos.size
}
我的数据类 Todo:
data class Todo(
val title: String,
var isChecked: Boolean = false
)
这是我尝试添加持久性的 MainActivity.kt 中的代码:
private fun setupInternalStorageRecyclerView() = binding.rvTodoItems.apply {
adapter = todoAdapter
layoutManager = rvTodoItems.layoutManager
}
private fun loadTodoItemsFromInternalStorageIntoRecyclerView() {
lifecycleScope.launch {
val todoItems = loadTodoItemsFromInternalStorage()
todoAdapter.submitList(todoItems)
}
}
private suspend fun loadTodoItemsFromInternalStorage(): List<Todo> {
return withContext(Dispatchers.IO) {
val todoItemList: MutableList<Todo> = mutableListOf<Todo>()
val files = filesDir.listFiles()
files?.filter { it.canRead() && it.isFile && it.name.endsWith(\".txt\") }?.map {
val lines = it.bufferedReader().readLines()
for (i in lines.indices step 2) {
todoItemList.add(Todo(lines[i], lines[i+1].toBoolean()))
}
todoItemList
} ?: mutableListOf<Todo>()
} as MutableList<Todo>
}
private fun saveTodoItemsToInternalStorage(filename: String, todoItems: List<Todo>): Boolean {
return try{
openFileOutput(\"$filename.txt\", MODE_PRIVATE).use { stream ->
File(filename).printWriter().use { out ->
for (item in todoItems) {
out.println(item.title)
out.println(item.isChecked)
}
}
}
true
} catch(e: IOException) {
e.printStackTrace()
false
}
}
我希望这是足够的信息来帮助我,请随时询问更多信息,我很乐意提供。
-
错误消息:不能使用提供的参数调用以下函数。 <init>(AsyncDifferConfig<Todo!>) where T = TypeVariable(T), VH = TypeVariable(VH) for constructor ListAdapter<T : Any!, VH : RecyclerView.ViewHolder!>(config: AsyncDifferConfig<T!>) 定义在 androidx.recyclerview.widget.ListAdapter <init>(DiffUtil.ItemCallback<Todo!>) where T = TypeVariable(T), VH = TypeVariable(VH) for constructor ListAdapter<T: Any!, VH: RecyclerView.ViewHolder!> (diffCallback: DiffUtil.ItemCallback<T!>) 定义在 androidx.recyclerview.widget.ListAdapter
标签: android kotlin android-recyclerview android-listadapter