Добавление Kotlin Android в список из другого действия

#android #kotlin

#Android #kotlin

Вопрос:

Итак, у меня есть список в одном классе, и я хочу добавить элементы в этот список из другого действия

Это код, который у меня есть до сих пор…

DashboardActivity.kt

 class DashboardActivity : AppCompatActivity() {

private lateinit var buttonAddSession: Button
internal lateinit var listViewSessions: ListView

internal lateinit var sessions: ArrayList<Session>

private lateinit var databaseSession: DatabaseReference

private lateinit var uid: String

override fun onCreate(savedInstanceState: Bundle?) {
    Log.i("in onCreate", "in on create method ")
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_dashboard)

    listViewSessions = findViewById<View>(R.id.listViewSessions) as ListView
    buttonAddSession = findViewById<View>(R.id.buttonAddSession) as Button

    databaseSession = FirebaseDatabase.getInstance().getReference()

    sessions = ArrayList()

    buttonAddSession.setOnClickListener {
        val intent = Intent(applicationContext, SessionActivity::class.java)
        intent.putParcelableArrayListExtra("Sessions", sessions)
        startActivity(intent)
        Log.i("onCreate Listener", "sessions count : "   sessions.count())
    }

    val username = intent.getStringExtra("com.example.tesla.myhomelibrary.useremail")
    //val username = savedInstanceState!!.getString("com.example.tesla.myhomelibrary.userid")
    Toast.makeText(
        applicationContext,
        "welcome user "   username.toString(),
        Toast.LENGTH_LONG
    ).show()
}
 

SessionActivity.kt

 class SessionActivity : AppCompatActivity() {

private lateinit var buttonSubmitSession: Button
private lateinit var sessionDate: DatePicker
private lateinit var sessionLocation: EditText
private lateinit var sessionRadioGroup: RadioGroup
private lateinit var sessionRadioButtonTexasHoldem: RadioButton
private lateinit var sessionRadioButtonPotLimitOmaha: RadioButton
private lateinit var smallBlindEntry: EditText
private lateinit var bigBlindEntry: EditText
private lateinit var buyInAmount: EditText
private lateinit var cashOutAmount: EditText
private lateinit var hoursPlayed: EditText

@SuppressLint("WrongViewCast")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_add_session)

    buttonSubmitSession = findViewById<View>(R.id.buttonSubmitSession) as Button
    sessionDate = findViewById<DatePicker>(R.id.datePicker) as DatePicker
    sessionLocation = findViewById<EditText>(R.id.locationEntry) as EditText
    sessionRadioGroup = findViewById<RadioGroup>(R.id.radioGroup) as RadioGroup
    sessionRadioButtonTexasHoldem = findViewById<RadioButton>(R.id.texasHoldemSelection) as RadioButton
    sessionRadioButtonPotLimitOmaha = findViewById<RadioButton>(R.id.PLOSelection) as RadioButton
    smallBlindEntry = findViewById<EditText>(R.id.smallBlindEntry) as EditText
    bigBlindEntry = findViewById<EditText>(R.id.bigBlindEntry) as EditText
    buyInAmount = findViewById<EditText>(R.id.buyInEntry) as EditText
    cashOutAmount = findViewById<EditText>(R.id.cashOutEntry) as EditText
    hoursPlayed = findViewById<EditText>(R.id.hoursPlayedEntry)

    val bundle = intent.extras
    var sessions = bundle?.getParcelableArrayList<Session>("Sessions")!!

    buttonSubmitSession.setOnClickListener {
        var date = sessionDate.dayOfMonth.toString()   "/"   sessionDate.month.toString()   "/"   sessionDate.year.toString()
        var sessionType = ""
        if (sessionRadioButtonTexasHoldem.isChecked()) {
            sessionType = "Texas Hold'Em"
        } else if (sessionRadioButtonTexasHoldem.isChecked()) {
            sessionType = "Pot Limit Omaha"
        }
        var location = sessionLocation.text.toString()
        var smallBlind = smallBlindEntry.text.toString().toInt()
        var bigBlind = bigBlindEntry.text.toString().toInt()
        var buyIn = buyInAmount.text.toString().toInt()
        var cashOut = cashOutAmount.text.toString().toInt()
        var hours = hoursPlayed.text.toString().toInt()

        var addThis = Session("sessionId", date, sessionType, location, smallBlind, bigBlind, buyIn, cashOut, hours)
        sessions.add(addThis)
        Log.i("SessionActivity method", "sessions count = "   sessions.count().toString())
        finish()
    }
}
}
 

Я пытаюсь добавить элементы в массив сеансов с помощью действия SessionActivity… проблема в том, что после возврата SessionActivity добавленные данные не отображаются в массиве сеансов в первом действии.

Ответ №1:

Из вашего FirstActivity вызовите SecondActivity, используя метод startActivityForResult()

Например:

 int ACTIVITY_CODE= 1
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, ACTIVITY_CODE);
 

В вашем SecondActivity задайте данные, которые вы хотите вернуть обратно в FirstActivity.

Например: в SecondActivity, если вы хотите отправить обратно данные:

 Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
 

Теперь в вашем классе FirstActivity напишите следующий код для метода onActivityResult().

 @Override
protected void onActivityResult(int requestCode, int     resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == ACTIVITY_CODE) {
    if(resultCode == Activity.RESULT_OK){
        String result=data.getStringExtra("result");
    }
    if (resultCode == Activity.RESULT_CANCELED) {
        //Write your code if there's no result
    }
  }
}
 

Комментарии:

1. На самом деле это устаревший способ. Взгляните на новый API результатов действия developer.android.com/training/basics/intents/result

2. Он еще не стабилен на стадии альфа-версии, поэтому я не рекомендовал API результатов активности.