Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Kotlin和SQLite在Android X中制作一个简单的可点击列表(Android Studio 4.1)_Android_Kotlin - Fatal编程技术网

使用Kotlin和SQLite在Android X中制作一个简单的可点击列表(Android Studio 4.1)

使用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

我来自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


问题:我应该如何继续为列表实现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 */
}