[코틀린] 빈배열 생성 후, intent 값이 넘어올 때 마다 배열에 값 추가하기가 안 됩니다.

조회수 986회

안녕하세요 선생님들 코틀린과 관련하여 어려운 점이 있어 질문드립니다.

제가 구현하고 싶은 것은, 한 액티비에서 값을 입력한 후 버튼을 클릭하면 다른 액티비의 리스트 뷰에 추가가 되는 것입니다.

그래서 리스트뷰에 사용되는 배열을 공백으로 설정하였고, 인텐드 값을 받으면 배열에 추가하는 모양을 구현했습니다.

하지만, 배열에 값이 들어오지를 않는지 또는 배열의 값이 변경이 안되는지 표시가 되지 않습니다.

이 부분 해결이 어려워 질문을 드리니 답변해주시면 정말 감사하겠습니다.

(만약 저의 질문이 이해가 안 되는 부분이 있을 때 답변 달아주시면 바로 댓글 달아드리겠습니다.)

  • 아래는 제가 작성한 액티비티 코드입니다.
  • 배열은 Class를 만들어 사용자하 시켰습니다.
메인 액티비티
package com.sampleconst

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.activity_main.*


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

        // 빈 배열 생성
        var UserList = arrayListOf<User>()

        // 토스트 메시지
        val Adapter = UserAdapter(this, UserList)

        Checklist.adapter = Adapter

        Checklist.onItemClickListener = AdapterView.OnItemClickListener { parent, _, position, _ ->
            val selectItem = parent.getItemAtPosition(position) as User
            Toast.makeText(this, selectItem.name, Toast.LENGTH_SHORT).show()
        }


        // 액티비티 전환
        btn_a.setOnClickListener{
            val intent = Intent(this, Addlist::class.java) // 다음 화면을 표시하기 위한 객체 생성
            startActivity(intent)
        }

        // 다른 액티비에서 받아온 값 빈 배열에 추가
        if(intent.hasExtra("msg")){
            val Additem01 = intent.getStringExtra("msg")
            UserList.plus(User(R.drawable.play, Additem01.toString(), "예시1", "예시2"))

        }
    }
}
배열 내 사용자화 시킨 클래스
package com.sampleconst

class User (val profile: Int, val name: String, val age: String, val greet: String)
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 다른 액티비티에서 메인 액티비티로 데이터를 넘기는 건가요? 데이터를 넘기기 위해 작성하신 intent.putStringExtra 부분이 어떻게 되어있는지 추가해주시면 좋을 것 같네요. 아니면 intent.getStringExtra("msg") 아래에 Toast.makeText(this, Additem01, Toast.LENGTH_SHORT).show()를 넣으면 값이 들어왔는지 여부는 알 수 있으니 넘기는 쪽에서 문제가 있었는지 알 수 있겠네요. 알 수 없는 사용자 2020.10.9 05:48
  • Add_btn.setOnClickListener{ val Additem01 = editTextTextPersonName.text.toString() val intent_a = Intent(this, MainActivity::class.java) intent_a.putExtra("msg",Additem01) startActivity(intent_a) } 와 같이 작성했습니다~!. 확실한 건 배열을 비어있는 상태가 아닌, 값이 들어있는 상태로 했을 때는 값이 넘어와 표시가 되는 것이 확인이 됩니다. 결국, 값은 정상적으로 넘어오지만, 비어있는 배열에서는 값 수정이 안되는걸로 확인됩니다! 저는 값이 추가될 때마다 배열에 새로 요소를 추가하고 그 값들이 리스트 뷰에 나오게 하고 싶습니다! 알 수 없는 사용자 2020.10.9 21:49

1 답변

  • 말씀하신 배열에서는 값 수정이 안되는걸로 확인됩니다. 가 맞는 것 같습니다.

    그리고 또한 plus는 element를 추가한 새 배열을 리턴할 뿐 실제 데이터는 변경하지 않는다고 합니다.

    그러니 사용 시에는 add를 사용하거나 아래와 같이 사용하시면 될 것 같습니다.

    • add는 ImmutableList 인 경우 사용할 수 없습니다. (kotlin은 기본적으로 ImmutableList 라고 하네요.)

    UserList = UserList.plus(User(R.drawable.play, Additem01.toString(), "예시1", "예시2"))

    public operator fun <T> Collection<T>.plus(element: T): List<T> {
        val result = ArrayList<T>(size + 1)
        result.addAll(this)
        result.add(element)
        return result
    }
    

    https://stackoverflow.com/questions/57770663/difference-between-plus-vs-add-in-kotlin-list

    위 내용 참고하시기 바랍니다.

    감사합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • arrayList는 기본적으로 mutableList입니다. 따라서 질문자께서 질문하신 부분에서는 add함수를 사용할 수 있을 것 같고 ArrayList가 아닌 단순 "Array"로 생성 혹은 "List" 타입 이용시 add가 불가능합니다. 그래서 타입에 따라 가능과 불가능이 나뉘는거지 "기본적으로 ImmutableList"라는 표현은 아닌 것 같습니다. 알 수 없는 사용자 2020.12.24 15:26

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)