如何解决Android Kotlin:startActivityForResult & Insert to RecylerView
我正在尝试使用 startActivityForResult 返回可用作要输入到原始活动中的 RecyclerView 中的数据的信息。
在活动 1 中,我为按钮设置了 onClickListener。按下按钮后,将启动带有一些选项的活动 2。用户填写这些选项,然后将它们返回到活动 1。
然后,活动 1 将一个条目插入 RecyclerView,其中包含从按钮按下和活动 2 返回的选项中收到的信息。
问题在于,一旦 Activity 2 完成并返回到 Activity 1,该条目就不会像它应该的那样添加到 RecyclerView 中。如何修复我的代码以便正确添加条目?
OrderActivity.kt - 活动 1
package com.example.pos
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.linearlayoutmanager
import com.example.multiplerecyclerview.OrderAdapter
import kotlinx.android.synthetic.main.activity_order.*
const val FILE_ID = 1
class OrderActivity : AppCompatActivity() {
val list = ArrayList<DataModel>()
// Adapter class is initialized and list is passed in the param.
val orderAdapter = OrderAdapter(this,getItemsList())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_order)
margButton.setonClickListener {
val food = "Margerita"
val price = 11.90
Toast.makeText(this,"$food clicked",Toast.LENGTH_LONG).show()
val intent = Intent(this@OrderActivity,PizzaActivity::class.java) /* Creating an Intent to go to Dashboard. */
intent.putExtra("foodName","$food")
intent.putExtra("foodPrice","$price")
startActivityForResult(intent,FILE_ID) /* Starting Activity. */
Log.i("Order","startActivityResult.\n")
}
//Set the LayoutManager that this RecyclerView will use.
orderRecyclerView.layoutManager = linearlayoutmanager(this)
//adapter instance is set to the recyclerview to inflate the items.
orderRecyclerView.adapter = orderAdapter
}
override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
super.onActivityResult(requestCode,resultCode,data)
Log.i("Order","OnActivityResult.\n")
if(requestCode == FILE_ID && resultCode == Activity.RESULT_OK) {
val foodPrice = intent.getStringExtra("foodPrice")
val foodSize = intent.getStringExtra("foodSize")
insertItem(view = margButton,foodType = "Margherita",price = foodPrice!!.todouble(),size = foodSize!!)
Log.i("Order","startActivityResult success\n")
} else {
Log.i("Order","onActivityResult Failed\n")
}
}
fun insertItem(view: View,foodType: String,price: Double,size: String) {
val index = 0
Toast.makeText(this,"Margerita clicked",Toast.LENGTH_LONG).show()
val newItem = DataModel("$foodType","$size","$price",viewType = OrderAdapter.NO_TOPPING)
list.add(index,newItem)
orderAdapter.notifyItemInserted(index)
}
private fun getItemsList(): ArrayList<DataModel> {
list.add(DataModel("Romana","1","12.50","Pepperoni","Aubergine","Ex Mozz.","Salami",OrderAdapter.TOPPINGS_4))
list.add(DataModel("American",viewType = OrderAdapter.NO_TOPPING))
return list
}
}
PizzaActivity.kt - 活动 2
package com.example.pos
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import com.example.multiplerecyclerview.OrderAdapter
import kotlinx.android.synthetic.main.activity_order.*
import kotlinx.android.synthetic.main.activity_pizza.*
class PizzaActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_pizza)
val ss1:String = intent.getStringExtra("foodName").toString()
val ss2:String = intent.getStringExtra("foodPrice").toString()
val textView1: TextView = findViewById<TextView>(R.id.pizzaName)
textView1.text = ss1
val textView2: TextView = findViewById<TextView>(R.id.pizzaPrice)
val textView3: TextView = findViewById<TextView>(R.id.pizzaSize)
val editText1: EditText = findViewById<EditText>(R.id.topping1Entry)
val editText2: EditText = findViewById<EditText>(R.id.topping2Entry)
val editText3: EditText = findViewById<EditText>(R.id.topping3Entry)
val editText4: EditText = findViewById<EditText>(R.id.topping4Entry)
tenInchButton.setonClickListener {
Toast.makeText(this,"Ten inch selected",Toast.LENGTH_LONG).show()
insertSize(size = "10",textView = textView3)
setPrice(price = 9.9,textView = textView2)
}
twelveInchButton.setonClickListener {
Toast.makeText(this,"Twelve inch selected",Toast.LENGTH_LONG).show()
insertSize(size = "12",textView = textView3)
setPrice(price = 11.8,textView = textView2)
}
additionalButton.setonClickListener {
var cost = .90
if(textView3.equals("10")) {
changePrice(price = cost,textView = textView2)
} else {
cost = 1.1
changePrice(price = cost,textView = textView2)
}
}
premiumButton.setonClickListener {
var cost = 1.3
if(textView3.equals("10")) {
changePrice(price = cost,textView = textView2)
} else {
cost = 1.5
changePrice(price = cost,textView = textView2)
}
}
completeBtn.setonClickListener {
emptyAdditions(editText1)
val intent = Intent(this@PizzaActivity,OrderActivity::class.java) /* Creating an Intent to go to Dashboard. */
intent.putExtra("foodPrice","$textView2")
intent.putExtra("foodSize","$textView3")
if (!emptyAdditions(editText1) || !emptyAdditions(editText2) || !emptyAdditions(editText3) || !emptyAdditions(editText4)) {
intent.putExtra("topping1","$editText1")
intent.putExtra("topping2","$editText2")
intent.putExtra("topping3","$editText3")
intent.putExtra("topping4","$editText4")
setResult(Activity.RESULT_OK,intent)
} else {
setResult(Activity.RESULT_OK,intent)
}
finish()
}
}
private fun emptyAdditions(editText: EditText): Boolean {
val msg: String = editText.text.toString()
//check if the EditText have values or not
return msg.trim().isNotEmpty()
}
private fun insertSize(size: String,textView: TextView) {
textView.text = size
}
private fun setPrice(price: Double,textView: TextView) {
textView.text = price.toString()
}
private fun changePrice(price: Double,textView: TextView) {
var cost = textView.text.toString()
var total = (cost.todouble() + price)
textView.text = total.toString()
}
}
这是活动 1。按钮在左侧,RecyclerView 在右侧。按下 Margherita Pizza 后,您将进入活动 2。
这是活动 2。一旦您选择了尺寸,您就可以按下完整的 Pizza。当您按下完成 Pizza 后,它会返回到活动 1,并将 12 英寸的 Margerita 添加到 RecyclerView。
错误信息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.pos,PID: 30885
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null,request=1,result=-1,data=Intent { cmp=com.example.pos/.OrderActivity (has extras) }} to activity {com.example.pos/com.example.pos.OrderActivity}: kotlin.KotlinNullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4268)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
at android.app.ActivityThread.-wrap19(UnkNown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: kotlin.KotlinNullPointerException
at com.example.pos.OrderActivity.onActivityResult(OrderActivity.kt:58)
at android.app.Activity.dispatchActivityResult(Activity.java:7276)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4264)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。