Unit2-3


目次


リストの2種類
  • List
  • MutableList
  • List
    val numbers: List<Int> = listOf(1, 2, 3, 4, 5, 6)
    //혹은(원소의 형태로 타입을 추측할 수 있는 경우.)
    val numbers = listOf(1, 2, 3, 4, 5, 6)
    println("List: $numbers")
    コトリンでリストを作成する方法
    //각기 다르게 출력됨. 원본은 안변하기 때문에..
    println("Reversed list: ${colors.reversed()}")
    println("List: $colors")
    リストは読み取り専用で、初期化が完了すると変更できません.ただし、ソート()や逆()などの操作を適用できます.
    MutableList
    val entrees = mutableListOf<String>()
    println("Add noodles: ${entrees.add("noodles")}")
    println("Entrees: $entrees")
    mutableListOf()で作成でき、addで要素を追加できます.printlnを入れたのは、出力のtrue/falseをチェックして、addが成功したか失敗したかを知るためです.
    val moreItems = listOf("ravioli", "lasagna", "fettuccine")
    println("Add list: ${entrees.addAll(moreItems)}")
    addAllは、複数の要素を同時に追加することができる.
    println("Remove spaghetti: ${entrees.remove("spaghetti")}")
    println("Remove first element: ${entrees.removeAt(0)}")
    entrees.clear()
    //true가 출력됨
    println("Empty? ${entrees.isEmpty()}")
    removeは、特定の要素を消去することができる.removeAtは、特定のインデックス内の要素を消去することができる.リスト全体を削除するにはclearを使用します.isEmptyを使用して、リストが空であるかどうかを確認します.
    複文
    val guestsPerFamily = listOf(2, 4, 1, 3)
    
    while (index < guestsPerFamily.size) {
        totalGuests += guestsPerFamily[index]
        index++
    }
    
     val names = listOf("Jessica", "Henry", "Alicia", "Jose")
     for (name in names) {
        println(name)
    }
    パラメータとしてリストを渡す
    class Vegetables(val toppings: List<String>) : Item("Vegetables", 5) {
    //toString-return을 안하면 객체만들어서 냅다 출력할때 이상해서.
    override fun toString(): String {
           return name
       }
    }
    fun main() {
         ...
         Vegetables(listOf("Cabbage", "Sprouts", "Onion"))
         ...
    }
    それより...
    class Vegetables(vararg val toppings: String) : Item("Vegetables", 5) {
    ...
    fun main() {
        ...
        val vegetables = Vegetables("Cabbage", "Sprouts", "Onion")
        ...
    }
    これにより、vararg修飾子を使用して、同じタイプの可変パラメータを関数または構造関数に渡すことがより効果的である.

    RecyclerView

    RecyclerViewは、画面上でスクロールされたビューを再利用して回収することができ、リストが大きい場合でも効率的に動作することができる.RecyclerViewの動作は、処理時間を大幅に短縮し、リストのスクロールをよりスムーズにするのに役立ちます.
    class Datasource {
        fun loadAffirmations():List<Affirmation>{
            //Affirmation 객체를 원소로 가지는 리스트를 반환
            return listOf<Affirmation>(
                Affirmation(R.string.affirmation1),
                Affirmation(R.string.affirmation2),
                Affirmation(R.string.affirmation3),
                Affirmation(R.string.affirmation4),
                Affirmation(R.string.affirmation5),
                Affirmation(R.string.affirmation6),
                Affirmation(R.string.affirmation7),
                Affirmation(R.string.affirmation8),
                Affirmation(R.string.affirmation9),
                Affirmation(R.string.affirmation10)
            )
        }
    }
    例では、確認オブジェクトのリストを返す関数と確認リストを表示するRecyclerViewを作成します.

  • item:表示するリスト内の単一のデータ項目.次の例は、確認クラスオブジェクトを示します.プロジェクトを定義するxml(ex:item list.xml)

  • Adapter:RecyclerViewのデータ.(データをビューに変換)

  • ViewHolder:RecyclerViewプロジェクトの表示時に使用/再使用するA pool views.

  • RecyclerView:画面に表示されるビュー.xmlで作成できます.
  • Adapter

    loadAffirmations関数から返されるリストから検証インスタンスを取得し、リスト項目ビューに切り替えるには、アダプタが必要です.

    ViewHolder

    RecyclerViewはitemviewと直接コミュニケーションしません.代わりにViewHoldersとコミュニケーションをとる.
    class ItemAdapter (private val context: Context, private val dataset: List<Affirmation>)
        : RecyclerView.Adapter<ItemAdapter.ItemViewHolder>()
    {
    
        // 각 data item에 대한 view reference 제공
        // 복잡한 data items 이라면 아이템 하나에 view 여러개가 있을 수도. 지금은 텍스트 하나로 구성된 아이템이지만 텍스트+이미지로 구성된 아이템이라면 이미지뷰도 찾아줘야겠지..이 경우 onBindViewHolder도 수정해야.
        //뷰홀더에서 모든 data item에 대한 접근 제공
        // 각 data item은 여기서 Affirmation 객체이다.
        class ItemViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
            val textView: TextView = view.findViewById(R.id.item_title)
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
            // create a new view
            //item.xml 레이아웃으로 이루어진 형태로 만든다
            val adapterLayout = LayoutInflater.from(parent.context)
                .inflate(R.layout.list_item, parent, false)
    
            return ItemViewHolder(adapterLayout)
        }
    
        //뷰의 컨텐츠를 대체. 레이아웃 매니저에 의해 호출됨 
        override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
            val item = dataset[position] //position 변수가 현재 항목을 나타냄.
            holder.textView.text =  context.resources.getString(item.stringResourceId)
        }
    
        //데이터셋의 사이즈 반환 
        override fun getItemCount(): Int {
            return dataset.size
        }
    }
    アダプタのコード.viewholderはネストされたクラスとして実装されます.
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            //데이터는 Datasource 에 있는 loadAffirmation이라는 손수 만든 함수 호출해서 가져오자.
            val myDataset = Datasource().loadAffirmations()
            //recyclerView라는 변수를 만들고 findViewById()를 사용하여
            // 레이아웃 내에서 RecyclerView 참조를 찾는다.
            val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
            //아까 만든 어댑터의 인스턴스를 만든다. ItemAdapter(this, myDataset)
            //이 어댑터를 선언한 recyclerView의 어댑터로 설정한다.
            recyclerView.adapter = ItemAdapter(this, myDataset)
     
            //recyclerView의 레이아웃 크기가 고정되어 있을때
            // 즉 컨텐츠가 변경되도 레이아웃 크기가 안바뀔때이 설정을 트루로 놓을 수 있다.
            recyclerView.setHasFixedSize(true)
        }
    }
    RecyclerViewは既にメインActivityで実装されており、現在はMainActivityです.ktを修正しましょう(RecyclerViewに実装済みアダプタの使用を通知する必要があります.)