Android Kotlin:startActivityForResult & Insert to RecylerView

如何解决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。

enter image description here

这是活动 2。一旦您选择了尺寸,您就可以按下完整的 Pizza。当您按下完成 Pizza 后,它会返回到活动 1,并将 12 英寸的 Margerita 添加到 RecyclerView。

enter image description here

错误信息:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?