获取“未连接适配器”;Kotlin中的“跳过布局”

5jvtdoz2  于 2023-04-07  发布在  Kotlin
关注(0)|答案(2)|浏览(129)

我无法找出适配器未连接的问题所在,我试图构建一个应用程序,该应用程序从资产/数据库/文件夹中的数据库文件中显示recyclerview中的药物名称。
这里是MainActivity.kt

import android.app.Activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class MainActivity : AppCompatActivity() {

    //private lateinit var dataModel: DataModel
    private lateinit var recyclerView: RecyclerView
    private lateinit var dataBaseHelper: DataBaseHelper
    private lateinit var drugs: ArrayList<DataModel>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myDatabase = DataBaseHelper(this).readableDatabase
        val cursor = myDatabase.query("drugindex", arrayOf("drug"), null, null, null, null, null)

        dataBaseHelper = DataBaseHelper(this)
        val recyclerView : RecyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.setHasFixedSize(true)

    }

    private fun displayuser() {
        drugs = ArrayList<DataModel>()
        recyclerView.adapter = MyAdapter(drugs)
    }

}

这里是MyAdapter.kt

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class MyAdapter(private val drugs: List<DataModel>) : RecyclerView.Adapter<MyAdapter.DrugViewHolder>() {
    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
        val textView : TextView = itemView.findViewById(R.id.txt)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DrugViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerviewitems, parent, false)
        return DrugViewHolder(view)
    }

    override fun onBindViewHolder(holder: DrugViewHolder, position: Int) {
        holder.bind(drugs[position])
    }

    override fun getItemCount(): Int {
        return drugs.size
    }

    inner class DrugViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(drug: DataModel) {
            itemView.findViewById<TextView>(R.id.txt).text = drug.drug_name
        }
    }
}

下面是DataBaseHelper.kt

import android.content.Context
import android.content.SharedPreferences
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import java.io.File
import java.io.FileOutputStream

class DataBaseHelper (private val context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

    private val preferences: SharedPreferences = context.getSharedPreferences(
        "${context.packageName}.database_versions",
        Context.MODE_PRIVATE
    )

    private fun installedDatabaseIsOutdated(): Boolean {
        return preferences.getInt(DATABASE_NAME, 0) < DATABASE_VERSION
    }

    private fun writeDatabaseVersionInPreferences() {
        preferences.edit().apply {
            putInt(DATABASE_NAME, DATABASE_VERSION)
            apply()
        }
    }

    private fun installDatabaseFromAssets() {
        val inputStream = context.assets.open("$ASSETS_PATH/$DATABASE_NAME.sqlite3")

        try {
            val outputFile = File(context.getDatabasePath(DATABASE_NAME).path)
            val outputStream = FileOutputStream(outputFile)

            inputStream.copyTo(outputStream)
            inputStream.close()

            outputStream.flush()
            outputStream.close()
        } catch (exception: Throwable) {
            throw RuntimeException("The $DATABASE_NAME database couldn't be installed.", exception)
        }
    }

    @Synchronized
    private fun installOrUpdateIfNecessary() {
        if (installedDatabaseIsOutdated()) {
            context.deleteDatabase(DATABASE_NAME)
            installDatabaseFromAssets()
            writeDatabaseVersionInPreferences()
        }
    }

    override fun getWritableDatabase(): SQLiteDatabase {
        throw RuntimeException("The $DATABASE_NAME database is not writable.")
    }

    override fun getReadableDatabase(): SQLiteDatabase {
        installOrUpdateIfNecessary()
        return super.getReadableDatabase()
    }

    override fun onCreate(db: SQLiteDatabase?) {
        // Nothing to do
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        // Nothing to do
    }

    companion object {
        const val DATABASE_NAME = "myDB"
        const val DATABASE_VERSION = 1
        const val ASSETS_PATH = "databases"
    }

}

下面是DataModel.kt

data class DataModel(
    val drug_name : String,
        )

我尝试了各种在线指南,但没有一个解决这个问题,我期待一个输出的名称列表

现在我更新了Mainactivity和adapter,错误消失了,但recyclerview或textview中看不到任何内容
更新了MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class MainActivity : AppCompatActivity() {

    private lateinit var dataModel: DataModel
    //private lateinit var recyclerView: RecyclerView
    private lateinit var dataBaseHelper: DataBaseHelper
    private lateinit var drugs: ArrayList<DataModel>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val recyclerView : RecyclerView = findViewById(R.id.recyclerView)
        val myDatabase = DataBaseHelper(this).readableDatabase
        val cursor = myDatabase.query("drugindex", arrayOf("drug_name"), null, null, null, null, null)

        dataBaseHelper = DataBaseHelper(this)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.setHasFixedSize(true)
        recyclerView.adapter = MyAdapter(ArrayList<DataModel>())

    }
}

更新MyAdapter.kt

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class MyAdapter(private val drugs: List<DataModel>) : RecyclerView.Adapter<MyAdapter.DrugViewHolder>() {

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
       private val textView : TextView = itemView.findViewById(R.id.txt)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DrugViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.recyclerviewitems, parent, false)
        return DrugViewHolder(view)
    }

    override fun onBindViewHolder(holder: DrugViewHolder, position: Int) {
        holder.bind(drugs[position])
    }

    override fun getItemCount(): Int {
        return drugs.size
    }

    class DrugViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(drug: DataModel) {
            itemView.findViewById<TextView>(R.id.txt).text = drug.drug_name
        }
    }
}
vcirk6k6

vcirk6k61#

下面的代码应该对你有用。

class MainActivity : AppCompatActivity() {

private lateinit var dataModel: DataModel
private lateinit var recyclerView: RecyclerView
private lateinit var dataBaseHelper: DataBaseHelper
private lateinit var drugs: ArrayList<DataModel>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val myDatabase = DataBaseHelper(this).readableDatabase
    val cursor = myDatabase.query("drugindex", arrayOf("drug"), null, null, null, null, null)

    dataBaseHelper = DataBaseHelper(this)
    var recyclerView : RecyclerView = findViewById(R.id.recyclerView)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.setHasFixedSize(true)
    recyclerView.adapter = MyAdapter(arrayListOf<Drugs>())
}

}

qlfbtfca

qlfbtfca2#

onCreate(savedInstanceState: Bundle?)方法中的这一行

val recyclerView : RecyclerView = findViewById(R.id.recyclerView)

从此处删除val,因为RecyclerView对象已在类顶部声明为var

private lateinit var recyclerView: RecyclerView

发生的是,它创建了两个不同的对象。一个带有recyclerview引用,另一个recyclerview对象没有初始化。您正在将适配器传递给未初始化的recyclerview对象

相关问题