투케이2K

451. (kotlin/코틀린) [유틸 파일] observableCustomListView : 커스텀 리스트 뷰 팝업창 표시 수행 본문

Kotlin

451. (kotlin/코틀린) [유틸 파일] observableCustomListView : 커스텀 리스트 뷰 팝업창 표시 수행

투케이2K 2024. 1. 12. 11:52

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[팝업창 호출 : 소스 코드]

        // -----------------------------------------------------------------------------------------
        // TODO [SEARCH FAST] : [Observable] : [Custom ListView 팝업창 호출 처리 메소드]
        // -----------------------------------------------------------------------------------------
        // TODO [호출 방법 소스 코드]
        // -----------------------------------------------------------------------------------------
        /*
        // [테스트 데이터 삽입]
        val list: ArrayList<JSONObject> = ArrayList<JSONObject>()

        for (i in 0..19) {

            try {
                val json = JSONObject()
                json.put("main", C_Util.getNowDateTime24())
                json.put("sub", "$i 번째 변경 이력 입니다")
                list.add(json)
            } catch (e: Exception) {
                e.printStackTrace()
            }

        }

        // [팝업창 활성 수행]
        C_Ui_View.observableCustomListView(this@A_Webview, ContextCompat.getDrawable(this@A_Webview, R.drawable.white_app_default), "변경 이력 보기", list, "확인", "취소")
            .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
            .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
            .subscribe(object : Observer<Int> {
                // [Observable.create 타입 지정]
                override fun onSubscribe(d: Disposable) {

                }
                override fun onNext(value: Int) {

                }
                override fun onError(e: Throwable) {

                }
                override fun onComplete() {

                }
            })
        */
        // -----------------------------------------------------------------------------------------
        var custom_list_index = -1
        var custom_list_item = ""
        var custom_list_alertDialog: AlertDialog? = null
        fun observableCustomListView(mContext: Context?, icon: Drawable?, title: String, array: ArrayList<JSONObject>?, ok: String, no: String): Observable<Int> {

            // [로직 처리 실시]
            return Observable.create<Int?> { subscriber: ObservableEmitter<Int> ->
                try {
                    // ===============================================================
                    //*
                    S_Log._F_(mContext!!, "커스텀 리스트 팝업창 호출 수행 실시", arrayOf(
                        "title :: $title",
                        "array :: " + array.toString()
                    ))
                    // */
                    // ===============================================================

                    if (array != null && array.size > 0) {

                        // [변수 초기화 실시]
                        custom_list_index = -1
                        custom_list_item = ""
                        custom_list_alertDialog = null


                        // [UI 생성 실시]
                        val listView = ListView(mContext)
                        listView.setPadding(70, 70, 70, 70)
                        listView.setBackgroundColor(Color.WHITE)
                        //listView.setSelector(R.color.white_color);
                        //listView.setDivider(new ColorDrawable(0xFFDDDDDD));
                        //listView.setDividerHeight(1);
                        //listView.setCacheColorHint(Color.TRANSPARENT);


                        // [어댑터 지정]
                        //ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_1, array);
                        val adapter = C_CustomListItemAdapter()

                        // [array 파싱 수행]
                        for (i in array.indices) {

                            // [json 파싱]
                            try {

                                val json = JSONObject(array[i].toString())

                                // 어댑터 추가
                                val main = json["main"].toString()
                                val sub = json["sub"].toString()
                                if (icon != null) {
                                    adapter.addItem(icon, main, sub)
                                } else {
                                    adapter.addItem(null, main, sub)
                                }

                            } catch (e: Exception) {

                                e.printStackTrace()
                            }
                        }


                        // [어댑터 지정]
                        listView.adapter = adapter


                        // [이벤트 지정]
                        listView.onItemClickListener = OnItemClickListener { parent, view, position, id -> // TODO data 변수에 현재 클릭한 배열값 저장 실시
                            custom_list_item = array[position].toString()

                            // TODO 인덱스 값 저장 실시
                            custom_list_index = position
                        }


                        // [팝업창 생성 실시]
                        Handler(Looper.getMainLooper()).postDelayed({

                            if (mContext != null) {

                                // [AlertDialog 팝업창 생성]
                                custom_list_alertDialog = AlertDialog.Builder(mContext)
                                    .setTitle(title) //[팝업창 타이틀 지정]
                                    //.setIcon(R.drawable.icon) //[팝업창 아이콘 지정]
                                    //.setMessage(message) //[팝업창 내용 지정]
                                    .setView(listView)
                                    .setCancelable(false) //[외부 레이아웃 클릭시도 팝업창이 사라지지않게 설정]
                                    .setPositiveButton(ok) { dialog, which ->
                                        // TODO Auto-generated method stub
                                        // -----------------------------------------
                                        try {
                                            S_Log._F_(mContext, "커스텀 리스트 팝업창 : [$ok] 버튼 클릭 이벤트 발생", null)
                                        } catch (e: Exception) {
                                        }
                                        // -----------------------------------------


                                        // -----------------------------------------
                                        // TODO [리턴 데이터 반환]
                                        // -----------------------------------------
                                        try {
                                            //subscriber.onNext(list_index);
                                            subscriber.onNext(0)
                                            subscriber.onComplete()
                                        } catch (ex: Exception) {
                                            ex.printStackTrace()
                                        }
                                        // -----------------------------------------
                                    }
                                    .setNegativeButton(no) { dialog, which ->
                                        // TODO Auto-generated method stub
                                        // -----------------------------------------
                                        // TODO [취소 버튼 클릭 이벤트 처리]
                                        // -----------------------------------------
                                        try {
                                            S_Log._F_(mContext, "커스텀 리스트 팝업창 : [$no] 버튼 클릭 이벤트 발생", null)
                                        } catch (e: Exception) {
                                        }
                                        // -----------------------------------------


                                        // -----------------------------------------
                                        // TODO [리턴 데이터 반환]
                                        // -----------------------------------------
                                        try {
                                            subscriber.onNext(-1)
                                            subscriber.onComplete()
                                        } catch (ex: java.lang.Exception) {
                                            ex.printStackTrace()
                                        }
                                        // -----------------------------------------
                                    }
                                    .show()
                            }
                        }, 0)
                    }

                } catch (e: Exception) {
                    e.printStackTrace()

                    // ------------------------------------------------------
                    // TODO [리턴 데이터 반환]
                    // ------------------------------------------------------
                    try {
                        subscriber.onNext(-1)
                        subscriber.onComplete()
                    } catch (ex: Exception) {
                        ex.printStackTrace()
                    }
                }
            }
        }

[어댑터 : 소스 코드]

package com.example.kotlinproject

import android.content.Context
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView

class C_CustomListItemAdapter : BaseAdapter() {



    /**
     * // --------------------------------------------------------------------------------------
     * TODO [클래스 설명]
     * // --------------------------------------------------------------------------------------
     * 1. 리스트 뷰 커스텀 제작 관련 클래스
     * // --------------------------------------------------------------------------------------
     */





    /**
     * // --------------------------------------------------------------------------------------
     * // TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // --------------------------------------------------------------------------------------
     * // [SEARCH FAST] : getView : 리스트 뷰 표시
     * // --------------------------------------------------------------------------------------
     * // [SEARCH FAST] : ListViewItem : 리스트 뷰 아이템 표시 속성 정의 (내부 클래스
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     */





    // -----------------------------------------------------------------------------------------
    // TODO [전역 변수 선언]
    // -----------------------------------------------------------------------------------------
    private val listViewItemList: ArrayList<ListViewItem> = ArrayList<ListViewItem>()





    // -----------------------------------------------------------------------------------------
    // TODO [Adapter 에 사용되는 데이터의 개수를 리턴]
    // -----------------------------------------------------------------------------------------
    override fun getCount(): Int {
        return listViewItemList.size
    }





    // -----------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : getView : 리스트 뷰 표시
    // -----------------------------------------------------------------------------------------
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var convertView = convertView
        val context = parent.context

        S_Log._D_("커스텀 리스트 뷰 화면 표시", arrayOf(listViewItemList[position].toString()))

        // [Layout을 inflate하여 convertView 참조 획득]
        if (convertView == null) {
            val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
            convertView = inflater.inflate(R.layout.custom_listview_item, parent, false)
        }

        // [화면에 표시될 View (Layout이 inflate) 로부터 위젯에 대한 참조 획득]
        val iconImageView = convertView!!.findViewById<View>(R.id.iconImageView) as ImageView
        val mainTextView = convertView!!.findViewById<View>(R.id.mainText) as TextView
        val subTextView = convertView!!.findViewById<View>(R.id.subText) as TextView

        // [Data Set 에서 position 에 위치한 데이터 참조 획득]
        val listViewItem = listViewItemList[position]

        // -----------------------------------------
        // [아이템 내 각 위젯에 데이터 반영]
        // -----------------------------------------
        /*
        iconImageView.setImageDrawable(listViewItem.getIcon());
        mainTextView.setText(listViewItem.getMain());
        subTextView.setText(listViewItem.getSub());
        // */
        // -----------------------------------------
        //*
        // -----------------------------------------
        if (listViewItem.icon != null) {
            iconImageView.setImageDrawable(listViewItem.icon)
        } else {
            iconImageView.visibility = View.GONE
        }
        // -----------------------------------------
        if (C_Util.stringNotNull(listViewItem.main.toString()) === true) {
            mainTextView.setText(listViewItem.main.toString())
        } else {
            mainTextView.visibility = View.GONE
        }
        // -----------------------------------------
        if (C_Util.stringNotNull(listViewItem.sub.toString()) === true) {
            subTextView.setText(listViewItem.sub.toString())
        } else {
            subTextView.visibility = View.GONE
        }
        // -----------------------------------------
        // */
        return convertView
    }





    // -----------------------------------------------------------------------------------------
    // TODO [지정한 위치(position)에 있는 position ID 리턴]
    // -----------------------------------------------------------------------------------------
    override fun getItemId(position: Int): Long {
        return position.toLong()
    }





    // -----------------------------------------------------------------------------------------
    // TODO [지정한 위치(position)에 있는 데이터 리턴]
    // -----------------------------------------------------------------------------------------
    override fun getItem(position: Int): Any {
        return listViewItemList[position]
    }





    // -----------------------------------------------------------------------------------------
    // TODO [어댑터 아이템 데이터 추가]
    // -----------------------------------------------------------------------------------------
    fun addItem(icon: Drawable?, main: String?, sub: String?) {
        val item = ListViewItem()

        item.icon = icon // [아이콘]
        item.main = main // [메인 설명]
        item.sub = sub // [서브 설명]

        listViewItemList.add(item)
    }





    // -----------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : ListViewItem : 리스트 뷰 아이템 표시 속성 정의 (내부 클래스)
    // -----------------------------------------------------------------------------------------
    internal inner class ListViewItem {
        var icon: Drawable? = null
        var main: String? = null
        var sub: String? = null
    }

} // TODO [클래스 종료]
 

[레이아웃 : 소스 코드]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginTop="15dp"
        android:id="@+id/iconImageView" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_marginLeft="10dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="Main Text"
            android:id="@+id/mainText"
            android:textSize="15dp"
            android:textColor="#000000"
            android:gravity="center_vertical"
            android:layout_weight="2"
            android:singleLine="true"
            android:ellipsize="end"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:text="Sub Text"
            android:id="@+id/subText"
            android:textSize="13dp"
            android:textColor="#666666"
            android:gravity="center_vertical"
            android:layout_weight="1"
            android:singleLine="true"
            android:ellipsize="end"/>

    </LinearLayout>

</LinearLayout>
 

[결과 출력]


반응형
Comments