我无法找出适配器未连接的问题所在,我试图构建一个应用程序,该应用程序从资产/数据库/文件夹中的数据库文件中显示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
}
}
}
2条答案
按热度按时间vcirk6k61#
下面的代码应该对你有用。
}
qlfbtfca2#
onCreate(savedInstanceState: Bundle?)
方法中的这一行从此处删除
val
,因为RecyclerView对象已在类顶部声明为var
发生的是,它创建了两个不同的对象。一个带有recyclerview引用,另一个recyclerview对象没有初始化。您正在将适配器传递给未初始化的recyclerview对象