在 kotlin 中获取'No adapter attached; skipping layout'



我无法找出是什么错了,适配器没有附加,我试图建立一个应用程序,显示药物的名称从数据库文件存在于资产/数据库/文件夹中的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和适配器,错误消失了,但在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
}
}
}

下面的代码应该可以为您工作。

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>())
}

}

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

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

从这里删除val作为回收视图对象已经声明为var在类的顶部

private lateinit var recyclerView: RecyclerView

实际上,它创建了两个不同的对象。一个具有recyclerview引用和另一个recyclerview对象的对象没有初始化。您正在将适配器传递给未初始化的recyclerview对象

相关内容

最新更新