인프런 커뮤니티 질문&답변

akainoo님의 프로필 이미지
akainoo

작성한 질문수

코틀린 기반 안드로이드 앱개발 기본 1단계

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

작성

·

261

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
질문자

해결했습니다. 

아래 코드에서 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를 접근하지 못하는 경우도 있기 때문에 거기에서 리플렉션을 사용해야 합니다... 상당 부분을 수정하셔야 하기 때문에 람다로 하는걸 추천드립니다. 람다를 사용하지 않으시면 이래저래 굉장히 불편합니다....

akainoo님의 프로필 이미지
akainoo

작성한 질문수

질문하기