如何从一个活动中获取 edittext 值到下一个活动的回收站视图? [英] How to fetch edittext value from one activity to recyclerview of next activity?

查看:36
本文介绍了如何从一个活动中获取 edittext 值到下一个活动的回收站视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从一项活动中获取 edittext 值并在回收视图中显示该文本并使用房间数据库进行存储....

基本上这个想法是在点击时在活动地址中添加地址加上它会重定向到下一个页面,用户在提交时获取地址表单,它将获取地址并添加到之前的活动回收视图中.

这是我的房间代码:

表格:---

@Entity(tableName = "address")类地址{@首要的关键变量 ID = 0@ColumnInfo(name = "地址")var 地址:字符串?= 空}

数据库:-

@Database(entities = [Address::class], version = 1)抽象类数据库: RoomDatabase() {抽象乐趣 AddressDao(): AddressDao}

地址道:

@Dao接口地址道{@插入暂停乐趣 addData(地址:地址)@Query(从地址中选择*")fun getAddressesWithChanges() :LiveData>@Query("SELECT EXISTS (SELECT 1 FROM address WHERE id=:id)")暂停乐趣 isAddressAdded(id: Int): Int@删除暂停乐趣删除(地址:地址)}

AddAddressActivity 活动:

 class AddAddressActivity : AppCompatActivity() {覆盖 fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.addaddress)val editText: EditText = findViewById(R.id.longaddress)val application = application as CustomApplicationsaveaddress.setOnClickListener {val 地址 = 地址()address.address = editText.getText().toString()生命周期范围.启动{application.addressDao.addData(地址)结束()}}}}

地址活动:-

 class AddressActivity : AppCompatActivity() {私有 val 适配器 = AddressAdapter()私有 lateinit var 数据:LiveData>覆盖 fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.address)addbutton.findViewById(R.id.addbutton).setOnClickListener {val 意图 = 意图(这个,AddAddressActivity::class.java)开始活动(意图)}val recyclerView = findViewById(R.id.recyclerview)recyclerView.setHasFixedSize(true)recyclerView.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,假)recyclerView.adapter = 适配器val application = application as CustomApplication数据 = application.database.AddressDao().getAddressesWithChanges()data.observe(this, Observer { words1 ->//更新适配器中单词的缓存副本.words1?.let { adapter.updateData(it) }})}}

AddressAdapter 活动:-

class AddressAdapter: RecyclerView.Adapter() {私有变量地址:列表<地址>= Collections.emptyList()覆盖乐趣 onCreateViewHolder(viewGroup: ViewGroup, itemViewType: Int):视图持有者 =ViewHolder(LayoutInflater.from(viewGroup.context).inflate(R.layout.address_item, viewGroup, false) )覆盖乐趣 onBindViewHolder(viewHolder: ViewHolder, position: Int) {val fl: 地址 = 地址 [位置]viewHolder.tv.setText(fl.address)}覆盖 fun getItemCount(): Int =addresses.size内部类 ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {无功电视:TextView在里面 {tv = itemView.findViewById(R.id.ftv_name)} }有趣的更新数据(地址:列表<地址>) {this.addresses = 地址notifyDataSetChanged()//TODO:如果需要动画,请使用 ListAdapter}

}

自定义应用程序:

class CustomApplication: Application() {lateinit var 数据库:数据库私人集lateinit var addressDao: AddressDao私人集覆盖乐趣 onCreate() {super.onCreate()this.database = Room.databaseBuilder<数据库>(应用上下文,数据库::class.java, 数据库").建造()}

}

返回地址活动时,列表未显示回收视图为空

请帮忙..我是 kotlin 和 room db 的新手..

解决方案

抽象乐趣 AddressDao():AddressDao?

为什么它可以为空?

<块引用>

val favoriteData: List?

为什么它可以为空?

<块引用>

有趣的 addData(favoriteList: Table?)

为什么它可以为空?

<块引用>

有趣的删除(favoriteList: Table?)

为什么它可以为空?


类型化可空性是使您能够表示给定值可以为空的位置,从这个意义上说它不存在是有意义的强>.

上述情况均不代表这种情况.Room 永远不会返回您 null 而不是实际的 dao.

Kotlin 的 null 安全性是允许您通过使其成为类型系统的一部分来消除潜在的错误情况,它不应该用于创建false"诸如此类的错误情况.如果您尝试将 null 添加到数据库而不是真实对象,则您的代码中可能存在错误,而 Kotlin 应该能够帮助您消除这种可能性.



至于您的实际问题,您正在滥用 Room.

.allowMainThreadQueries() 是一种禁用错误检查的方法,但该错误是有原因的.您不应该在 UI 线程上读取数据,因为如果有足够的数据,您的应用将冻结 (ANR).

代码应该是这样的:

@Entity(tableName = "address")类地址{@首要的关键变量 ID = 0@ColumnInfo(name = "地址")var 地址:字符串?= 空}

数据库:-

@Database(entities = [Address::class], version = 1)抽象类数据库: RoomDatabase() {抽象有趣的 addressDao():AddressDao}

地址道:

@Dao接口地址道{@插入暂停乐趣 addData(地址:地址)@Query(从地址中选择*")fun getAddressesWithChanges(): LiveData>@Query("SELECT EXISTS (SELECT 1 FROM address WHERE id=:id)")暂停乐趣 isAddressAdded(id: Int): Int@删除暂停乐趣删除(地址:地址)}类自定义应用程序:应用程序(){lateinit var 数据库:数据库私人集Lateinit var addressDao: AddressDao私人集覆盖乐趣 onCreate() {super.onCreate()this.database = Room.databaseBuilder<数据库>(应用上下文,数据库::class.java, 数据库").建造()addressDao = database.addressDao()}}

AndroidManifest.xml

地址活动:

import androidx.lifecycle.observe类地址活动:AppCompatActivity(){私有 val 适配器 = AddressAdapter()私有 lateinit var 数据:LiveData>覆盖 fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.address_activity)findViewById(R.id.addButton).setOnClickListener {val 意图 = 意图(这个,AddAddressActivity::class.java)开始活动(意图)}val recyclerView = findViewById(R.id.recyclerview)recyclerView.setHasFixedSize(true)recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)recyclerView.adapter = 适配器val application = application as CustomApplicationval addressDao = application.addressDao数据 = addressDao.getAddressesWithChanges()数据.观察(这个){适配器.updateData(它)}}}

地址适配器:

class AddressAdapter: RecyclerView.Adapter() {私有变量地址:List
= Collections.emptyList()覆盖乐趣 onCreateViewHolder(viewGroup: ViewGroup, itemViewType: Int): ViewHolder =ViewHolder(LayoutInflater.from(viewGroup.context).inflate(R.layout.address_item, viewGroup, false))覆盖乐趣 onBindViewHolder(viewHolder: ViewHolder, position: Int) {val 地址 = 地址 [位置]viewHolder.tv.setText(address.address)}覆盖 fun getItemCount(): Int =addresses.size内部类 ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {val tv = itemView.findViewById(R.id.ftv_name)}有趣的更新数据(地址:列表<地址>){this.addresses = 地址notifyDataSetChanged()//TODO:如果需要动画,请使用 ListAdapter}}

AddAddress 活动:-

class AddAddressActivity : AppCompatActivity() {覆盖 fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.addaddress)val editText: EditText = findViewById(R.id.longaddress)val application = application as CustomApplicationval addressDao = application.addressDaosaveaddress.setOnClickListener {val 地址 = 地址()address.address = editText.getText().toString()生命周期范围.启动{addressDao.addData(地址)结束()}}}}

您也可以参考https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#6

I'm trying to fetch edittext value from one activity and displaying that text in recycleview and storing using room DB....

Basically the idea is adding the address in activity address when clicks on plus it will redirect to next page where the user gets the address form onsubmit it will fetch address and add to previous activity recycleview.

here is my code for room:

table:---

@Entity(tableName = "address")
class Address {
@PrimaryKey
var id = 0

@ColumnInfo(name = "address")
var address: String? = null
}

Database:-

@Database(entities = [Address::class], version = 1)
 abstract class Database : RoomDatabase() {
abstract fun AddressDao(): AddressDao
}

AddressDao:

@Dao
interface AddressDao {
@Insert
suspend fun addData(address: Address)



@Query("select * from address")
fun getAddressesWithChanges() :LiveData<List<Address>>

@Query("SELECT EXISTS (SELECT 1 FROM address WHERE id=:id)")
suspend fun isAddressAdded(id: Int): Int

@Delete
suspend fun delete(address: Address)
}

AddAddressActivity activity:

   class AddAddressActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.addaddress)

    val editText: EditText = findViewById(R.id.longaddress)

    val application = application as CustomApplication

    saveaddress.setOnClickListener {
        val address = Address()
        address.address = editText.getText().toString()

        lifecycleScope.launch {
            application.addressDao.addData(address)
            finish()
           }
         }
       }
      }

AddressActivity:-

     class AddressActivity : AppCompatActivity() {
      private val adapter = AddressAdapter()

     private lateinit var data: LiveData<List<Address>>

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

    addbutton.findViewById<View>(R.id.addbutton).setOnClickListener {
        val intent = Intent(this, AddAddressActivity::class.java)
        startActivity(intent)
    }

    val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager = LinearLayoutManager(this, 
    LinearLayoutManager.VERTICAL, false)
    recyclerView.adapter = adapter

    val application = application as CustomApplication
    data = application.database.AddressDao().getAddressesWithChanges()
    data.observe(this, Observer { words1 ->
        // Update the cached copy of the words in the adapter.
        words1?.let { adapter.updateData(it) }})


}
  }

AddressAdapter activity:-

class AddressAdapter: RecyclerView.Adapter<AddressAdapter.ViewHolder>() {
private var addresses: List<Address> = Collections.emptyList()

override fun onCreateViewHolder(viewGroup: ViewGroup, itemViewType: Int): 
   ViewHolder =
  ViewHolder(LayoutInflater.from(viewGroup.context)
  .inflate(R.layout.address_item, viewGroup, false) )

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
    val fl: Address = addresses[position]
    viewHolder.tv.setText(fl.address)
}

override fun getItemCount(): Int = addresses.size

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var tv: TextView

    init {
        tv = itemView.findViewById(R.id.ftv_name)
    }    }

fun updateData(addresses:
               List<Address>) {
    this.addresses = addresses
    notifyDataSetChanged() // TODO: use ListAdapter if animations are needed
}

}

CustomApplication:

class CustomApplication: Application() {
lateinit var database: Database
    private set
lateinit var addressDao: AddressDao
    private set

override fun onCreate() {
    super.onCreate()

    this.database = Room.databaseBuilder<Database>(
        applicationContext,
        Database::class.java, "database"
    ).build()

}

}

list is not displaying recycleview is empty when came back to address activity

please help ..I'm new to kotlin and room db..

解决方案

abstract fun AddressDao(): AddressDao?

Why is this nullable?

val favoriteData: List<Table>?

Why is this nullable?

fun addData(favoriteList: Table?)

Why is this nullable?

fun delete(favoriteList: Table?)

Why is this nullable?


Typed nullability is to enable you to represent where a given value can be null, in the sense that it makes sense for it to be absent.

Neither of the above cases represent such a scenario. Room will never return you null instead of an actual dao.

Kotlin's null safety is to allow you to eliminate potential error cases by making it part of the type system, it shouldn't be used to create "false" error cases such as these. If you're trying to add null to a database instead of a real object, you've probably got a bug in your code, and Kotlin should be able to help you eliminate that possibility.



As for your actual question, you're misusing Room.

.allowMainThreadQueries() is a way to disable an error check, but that error is there for a reason. You're not supposed to be reading the data on the UI thread, because with enough data, your app will freeze (ANR).

The code is supposed to look something like this:

@Entity(tableName = "address")
class Address {
    @PrimaryKey
    var id = 0

    @ColumnInfo(name = "address")
    var address: String? = null
}

Database:-

@Database(entities = [Address::class], version = 1)
abstract class Database : RoomDatabase() {
    abstract fun addressDao(): AddressDao
}

AddressDao:

@Dao
interface AddressDao {
    @Insert
    suspend fun addData(address: Address)

    @Query("select * from address")
    fun getAddressesWithChanges(): LiveData<List<Address>>

    @Query("SELECT EXISTS (SELECT 1 FROM address WHERE id=:id)")
    suspend fun isAddressAdded(id: Int): Int

    @Delete
    suspend fun delete(address: Address)
}


class CustomApplication: Application() {
    lateinit var database: Database
        private set
    lateinit var addressDao: AddressDao
        private set
    
    override fun onCreate() {
        super.onCreate()

        this.database = Room.databaseBuilder<Database>(
            applicationContext,
            Database::class.java, "database"
        ).build()

        addressDao = database.addressDao()
    }
}

AndroidManifest.xml

<application android:name=".CustomApplication"
    ...

Address activity:

import androidx.lifecycle.observe

class AddressActivity : AppCompatActivity() {
    private val adapter = AddressAdapter()

    private lateinit var data: LiveData<List<Address>>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.address_activity)
 
        findViewById<View>(R.id.addButton).setOnClickListener {
            val intent = Intent(this, AddAddressActivity::class.java)
            startActivity(intent)
        }

        val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
        recyclerView.setHasFixedSize(true)
        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        recyclerView.adapter = adapter

        val application = application as CustomApplication
        val addressDao = application.addressDao 

        data = addressDao.getAddressesWithChanges()
        data.observe(this) {
            adapter.updateData(it)
        }
    }
}

AddressAdapter:

class AddressAdapter: RecyclerView.Adapter<AddressAdapter.ViewHolder>() {
    private var addresses: List<Table> = Collections.emptyList()

    override fun onCreateViewHolder(viewGroup: ViewGroup, itemViewType: Int): ViewHolder =
        ViewHolder(LayoutInflater.from(viewGroup.context).inflate(R.layout.address_item, viewGroup, false))

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        val address = addresses[position]
        viewHolder.tv.setText(address.address)
    }

    override fun getItemCount(): Int = addresses.size

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tv = itemView.findViewById(R.id.ftv_name)
    }

    fun updateData(addresses: List<Address>) {
        this.addresses = addresses
        notifyDataSetChanged() // TODO: use ListAdapter if animations are needed
    }
}

AddAddress activity:-

class AddAddressActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.addaddress)

        val editText: EditText = findViewById(R.id.longaddress)

        val application = application as CustomApplication
        val addressDao = application.addressDao
        
        saveaddress.setOnClickListener {
            val address = Address()
            address.address = editText.getText().toString()

            lifecycleScope.launch {
                addressDao.addData(address)
                finish()
            }
        }
    }
}

You can potentially also refer to https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#6

这篇关于如何从一个活动中获取 edittext 值到下一个活动的回收站视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆