중첩 클래스를 이용한 ListView Listener 구현

20.04.08 10:33 작성 조회수 186

0

package com.example.applearning

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Adapter
import android.widget.AdapterView
import android.widget.SimpleAdapter
import kotlinx.android.synthetic.main.activity_adapter_view2.*

class AdapterView2 : AppCompatActivity() {
    /*
        Two Line ListView
        문자열(TextView) 2개를 보여줄때 사용하는 ListView
     */
    private var data1TwoLineList = arrayOf("문자열1","문자열2","문자열3","문자열4","문자열5","문자열6")
    private var data2TwoLineList = arrayOf("String1","String2","String3","String4","String5","String6")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_adapter_view2)
        //공통 리스너
        val adapterListener =ListListener()

        //1) TwoLineList 예제
        var listTwoLineList = ArrayList<HashMap<String,String>>()

        var idx=0
        while(idx<data1TwoLineList.size){
            var map = HashMap<String,String>()
            //이렇게 표시하는게 좀더 나은 방법이라고 안드로이드 스튜디오에서 추천중
            map["str1"] = data1TwoLineList[idx]
            map.put("str2",data2TwoLineList[idx])
            listTwoLineList.add(map)

            idx++
        }
        var keyTwoLineList = arrayOf("str1","str2")
        var idsTwoLineList = intArrayOf(android.R.id.text1,android.R.id.text2)
        /*
            SimpleAdapter 를 써야 2가지 이상 항목을 담을 수 있고
            simple expandable list item 2 이 TextView 를 2개 담는 Adapter
         */
        var adapterTwoLineList= SimpleAdapter(this,listTwoLineList,android.R.layout.simple_expandable_list_item_2,keyTwoLineList,idsTwoLineList)
        two_line_list_view.adapter=adapterTwoLineList

        //Listener setting
        two_line_list_view.onItemClickListener=adapterListener
    }


    //Listener 모음
    inner class ListListener : AdapterView.OnItemClickListener{
        override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            when(view?.id){
                R.id.two_line_list_view
                    ->  two_line_list_txt_.text = data1TwoLineList[position]
            }
        }
    }
}

Adapter쪽을 공부하고 있습니다

개인적으로는 람다식보다 중첩 클래스가 더 편해서, 중첩 클래스로 구현하고자 하는데 이렇게 구현하니깐 

눌러도 아무런 반응이 없습니다. 어떻게 바꾸어야 하나요?

답변 2

·

답변을 작성해보세요.

0

akainoo님의 프로필

akainoo

질문자

2020.04.10

해결했습니다. 

아래 코드에서 view가 아닌 parent로 하면 되더군요

override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            when(view?.id){
                R.id.two_line_list_view
                    ->  two_line_list_txt_.text = data1TwoLineList[position]
            }
        }

0

음... 람다식을 사용하지 않았기 때문에 상당 부분 손을 보셔야 합니다. 일단 확인해 보셔야 할 부분이 onItemClick 메서드가 호출되는지 확인해보셔야 합니다. 또 중첩클래스 안에서 MainActivity의 View를 접근하지 못하는 경우도 있기 때문에 거기에서 리플렉션을 사용해야 합니다... 상당 부분을 수정하셔야 하기 때문에 람다로 하는걸 추천드립니다. 람다를 사용하지 않으시면 이래저래 굉장히 불편합니다....