使用Kotlin和SQLite在Android X中制作一个简单的可点击列表(Android Studio 4.1)
我来自Android Java,我以前使用过ListView。现在我正在尝试使用androidx.recyclerview.widget.recyclerview在Android X Kotlin中创建一个简单的列表 我的应用程序正在运行,但我不确定如何实现项的onclick侦听器 我的应用程序具有以下功能: DatabaseHelper:创建表类别并插入一些类别 IdTitleDataClass:类别的数据类,具有字段id和标题 IdTitleAdapter:列表适配器。它使用布局适配器\u id\u title\u item\u布局 适配器\u id\u标题\u项目\u布局:列表项目的布局 activity_main:带有一个androidx.recyclerview.widget.recyclerview的activity main布局 MainActivity:从表中获取数据并将其显示到列表中。 源代码位于此处: 更新代码26.10.2020 数据库助手 IdTitleAdapter 主要活动 activity_main.xml 适配器\u id\u title\u item\u layout.xml使用Kotlin和SQLite在Android X中制作一个简单的可点击列表(Android Studio 4.1),android,kotlin,Android,Kotlin,我来自Android Java,我以前使用过ListView。现在我正在尝试使用androidx.recyclerview.widget.recyclerview在Android X Kotlin中创建一个简单的列表 我的应用程序正在运行,但我不确定如何实现项的onclick侦听器 我的应用程序具有以下功能: DatabaseHelper:创建表类别并插入一些类别 IdTitleDataClass:类别的数据类,具有字段id和标题 IdTitleAdapter:列表适配器。它使用布局适配器\u
问题:我应该如何继续为列表实现onclick listener?对我来说最有意义的是,既然您将列表作为参数传递给适配器,那么它应该传递什么以及它的项。当然,这是一种偏好,没有对错之分,只要确保与你的团队保持一致就行了
class IdTitleAdapter(
val list: ArrayList<IdTitleDataClass>,
val clickLambda: suspend (Int)->Unit)
: RecyclerView.Adapter<IdTitleViewHolder>()
然后初始化适配器,如下所示:
recycler_view.adapter = IdTitleAdapter(categoriesList) {
something(it) /* or even categoriesList[it]
if you passed the position instead of the id */
}
什么是setOnClickListener?我得到这个错误:未解析的引用:setOnClickListener。还有什么事吗?对不起,我忘了键入itemView已修复。使用setOnClickListener,可以将单击侦听器设置为所需的视图。如果itemView不能满足您的需要,您也可以将id设置为中的任何其他视图,并在其上设置单击侦听器。例如,holder.textViewTitle.setOnClickListener{clickLambdacurrentItem.id}如果您希望文本视图可单击。有些东西不是真正的函数,它表示您必须实现的方法,单击项目时将调用该方法。例如,如果您将clickLambda更改为val clickLambda:TextView->Unit,并在onBindHolder中像so holder.itemView.setOnClickListener{clickLambdaholder.textViewTitle}一样传递TextView,则可以使用recycler\u view.adapter=IdTitleAdaptercategoriesList{it.text=Hello World!}当你点击它时,它会改变每个项目的文本。我不明白。我在clickLambda上遇到这个错误:应该只从一个协同程序或另一个挂起函数调用挂起函数“invoke”,只需删除挂起即可。正如我所说的,只有在你打算使用协同程序的情况下,它才会出现。上面的协同程序示例可能是这样的:recycler_view.adapter=IdTitleAdaptercategoriesList{MainScope.launch{it.text=Hello World!}。如果你不知道它是什么,就不要使用它。当你准备好变得更困惑时,请阅读
package net.frindex.kotlinandroidxrecycleviewsimplesqlite.recyclerViewAdapters
data class IdTitleDataClass (val id:Int, val title:String)
package net.frindex.kotlinandroidxrecycleviewsimplesqlite
/**
*
* File: MainActivity.kt
* Version 1.0
* Date 24.10.2020
* Copyright (c) 2020 S Ditlefsen
* License: http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
import android.database.Cursor
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import com.facebook.stetho.Stetho
import kotlinx.android.synthetic.main.activity_main.*
import net.frindex.kotlinandroidxrecycleviewsimplesqlite.db.DatabaseHelper
import net.frindex.kotlinandroidxrecycleviewsimplesqlite.recyclerViewAdapters.IdTitleAdapter
import net.frindex.kotlinandroidxrecycleviewsimplesqlite.recyclerViewAdapters.IdTitleDataClass
import java.util.ArrayList
class MainActivity : AppCompatActivity() {
// Class variables
var db: DatabaseHelper? = null
private lateinit var categoriesList: ArrayList<IdTitleDataClass>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// DB :: Open Chrome and go to URL chrome://inspect/#devices
Stetho.initializeWithDefaults(this)
// List categories
listCategories()
} // onCreate
/*- List categories -------------------------------------------------------------------------- */
fun listCategories(){
// DB
db = DatabaseHelper(this)
// Fetch categories
var categoriesCursor: Cursor? = db!!.rawQuery("SELECT category_id, category_name FROM categories")
var categoriesSize: Int = categoriesCursor!!.count
Log.d("listCategories()", "categoriesSize=" + categoriesSize)
// Add a list of categories
categoriesList = ArrayList<IdTitleDataClass>()
while (categoriesCursor.moveToNext()) {
val categoryId = categoriesCursor.getInt(0)
val categoryName = categoriesCursor.getString(1)
Log.d("listCategories()", "categoryId=" + categoryId + " categoryName=" + categoryName)
categoriesList.add(IdTitleDataClass(categoryId, categoryName))
}
// Add to list
recycler_view.adapter = IdTitleAdapter(categoriesList) {
categoriesList[it]
}
recycler_view.layoutManager = LinearLayoutManager(this)
recycler_view.setHasFixedSize(true)
} // listCategories
} // MainActivity
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/constraintLayout">
<!-- Categories -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:listitem="@layout/rva_id_title_item_layout"
app:layout_constraintTop_toTopOf="parent" />
<!-- //Categories -->
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp">
<TextView
android:id="@+id/textViewTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:text="Title"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textStyle="bold" />
</LinearLayout>
</androidx.cardview.widget.CardView>
class IdTitleAdapter(
val list: ArrayList<IdTitleDataClass>,
val clickLambda: suspend (Int)->Unit)
: RecyclerView.Adapter<IdTitleViewHolder>()
override fun onBindViewHolder(holder: IdTitleViewHolder, position: Int) {
val currentItem = list[position]
holder.textViewTitle.text = currentItem.title
holder.itemView.setOnClickListener {
clickLambda(currentItem.id)
}
}
recycler_view.adapter = IdTitleAdapter(categoriesList) {
something(it) /* or even categoriesList[it]
if you passed the position instead of the id */
}