alertDialog

-대화 상자를 말하는데 어떤 앱을 실행 시 경고 메세지나 특정한 정보를 알려주기 위한 다이얼로그를 말한다.

handler를 이용해 특정한 시간이 지났을 때, 특정한 버튼을 눌렀을 때 구현하는 기능이다.

이와 같이 확인 버튼을 눌러서 어플을 사용하는데 제약을 걸거나 이벤트를 발생하게 한다.

보통은 확인과 취소버튼으로 이루어져있다.

자신이 원하는 형태로 AlertDialog를 만들 수 있다! 자세한 코드는 아래에서 살펴보자.

 

AlertDialog builder <----> alertDialog의 관계

builder : 대화상자안에 있는 속성을 정의한다(title이나 버튼 눌렀을 때 나타나는 속성들을 가르킴)

alertDialog : create()함수를 통해 builder에게 전달받아서 생성을 하고 구현하는 로직이다

 

 

 

builder로 정의한 후  msgDlg로 AlertDialog를 만들어 사용한다!!

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn_quit = (Button)findViewById(R.id.btn_quit);
        btn_quit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder msgBuilder = new AlertDialog.Builder(MainActivity.this)
                        .setTitle("어플 종료") //title setting
                        .setMessage("어플 종료??!") //
                        .setPositiveButton("끈다", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                finish();
                            }
                        })
                        .setNegativeButton("안끈다", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                Toast.makeText(getApplicationContext(),"안끌래",Toast.LENGTH_LONG).show();
                            }
                        }); // 띄우고자 하는 다이얼로그 속성을 지정해주는 것을 마무리한다
                AlertDialog msgDlg = msgBuilder.create(); //속성을 지정한 msgBuilder 객체를 바탕으로 AlertDialog가 생성됨
                msgDlg.show();
            }
        });

    }

 

 

ListView & Arrayadapter

리스트 뷰는 해당 뷰들을 리스트 형태로 나열하는 방법을 말한다.

ArrayList로 list를 만든 후 Adapter에게 list값들을 전달하여 ListView에 전달한다. 즉 Adapter는 매개체 역할을 한다.

Data -----> Adapter <---- ListView -->(xml)

 

아래의 그림은 4가지의 List를 만든후 ListView가 클릭됬을 때 해당 position에 따라 출력되는 화면이다.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);

        final TextView  tv_select = (TextView)findViewById(R.id.tv_select);
         final ListView listView = (ListView)findViewById(R.id.listView);

         final List<String> list = new ArrayList<>();
        list.add("사과");
        list.add("배");
        list.add("딸기");
        list.add("감자");

        //adapter list관계
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,list);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                String name = (String) listView.getItemAtPosition(position); //listView안에 있는 position에 위치한 값을 가져옴
                tv_select.setText("항목 선택 결과는 "+name+"입니다!!");
                //position 값 : 각각의 항목 위치
            }
        });
    }

 

 

 

 

 

 

 

 

 

String값을 전달받아 intent로 MainAcitivty2에 넘겨준다.

전달받은 intent값을 그 액티비티에서 호출한다.

 

MainAcitity

package kr.teamcadi.intentactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button)findViewById(R.id.btn_intent);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,MainActivity2.class);
                intent.putExtra("key","Hi SEUNGWON");
                startActivity(intent);
                finish();
            }
        });
    }
}

 

MainActivity2

package kr.teamcadi.intentactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Button btn2 =(Button)findViewById(R.id.btn_int2);
        final TextView textView = (TextView) findViewById(R.id.textView);

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent2 =getIntent();
                String txt =intent2.getStringExtra("key");
                if(txt !=null)
                    textView.setText(txt);
            }
        });
    }
}

intent를 활용한 전화걸기 어플

 

 

 

 

 

 

 

Intent를 통해 전화거는 다이얼 입력 화면까지만 전달해 준다.

 

MainActivity

package kr.teamcadi.callactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn_intent = (Button)findViewById(R.id.btn_intent);

        btn_intent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("tel:010-3792-8160")));
            }
    });
    }
}

 

Array & ArrayList

 

 

Array 와 ArrayList는 비슷하면서도 큰 차이가 있다.

 

 

 

1. Array는 정적인 배열이고 ArrayList는 동적인 배열이다. 즉 Array는 배열의 크기를 늘리거나 줄일 수 없으며 ArrayList는 변할 수 있다. 

 

2. 크기가 불변인 Array는 크기가 정해져 있기 때문에 초기화시 메모리가 할당되어 속도가 빠르고

ArrayList는 반대로 느리다. 상황에 맞게 사용하면 된다.

 

 

3. Array는 primitive 타입과 Object를 선언할 수 있지만 ArrayList는 Object로만 가능하다.

Array -( int,char,float,double ... )

ArrayList - (Integer,String ...)

 

 

 

 

Array

int[] array = new int[5];
for(int i=0;i<5;i++){
	array[i]=i+1;
}
// array[0]=1  array[1]=2  array[2]=3  array[3]=4  array[4]=5

 

 

 

 

 

ArrayList

  •  add 나 remove로 크기 변화 가능
ArrayList<Integer> arrayList = new ArrayList<>();
for(int i=0;i<5;i++){
	arrayList.add(i);
 }
// arrayList 에 1,2,3,4,5 추가

arrayList.remove(1);
//1번째 인덱스 삭제 -> 값이 1인 리스트 삭제가 아님!

계산기 만들기

 

 

어플 화면

 

 

 

 

 

activity_main.xml

 

 

 

LinearLayout,RelativeLayout,TableLayout을 사용한다.

 

button이 눌릴 때 발생하는 setOnClickListener를 이용하여 만든다.

 

 각 버튼이 눌렸을 때 case문으로 각각의 기능을 구현하였다.

 

 

 

ex> '='버튼

 case R.id.btn_result:
                        num_Sec = txt_result.getText().toString();
                        save += txt_result.getText().toString();
                        txt_result.setText(save);

                        Double num1 = Double.parseDouble(num_fst);
                        Double num2 = Double.parseDouble(num_Sec);

                        switch (calculate) {
                            case 1:
                                String result_1 = String.valueOf(num1 + num2);
                                txt_result.setText(result_1);
                                break;
                            case 2:
                                String result_2 = String.valueOf(num1 - num2);
                                txt_result.setText(result_2);
                                break;
                            case 3:
                                String result_3 = String.valueOf(num1 * num2);
                                txt_result.setText(result_3);
                                break;
                            case 4:
                                try {
                                    String result_4 = String.valueOf(num1 / num2);
                                    txt_result.setText(result_4);
                                }
                                catch (ArithmeticException e){
                                    Toast.makeText(getApplicationContext(),"0으로 나눌 수 없습니다", Toast.LENGTH_LONG).show();
                                }
                                break;
                            case 5:
                                try {
                                    String result_5 = String.valueOf(num1 % num2);
                                    txt_result.setText(result_5);
                                }
                                catch (ArithmeticException e) {
                                    Toast.makeText(getApplicationContext(),"0으로 나눌 수 없습니다", Toast.LENGTH_LONG).show();
                                }
                                break;

                        }
                        num_fst = txt_result.getText().toString();
                        break;

 

문제점 

8+3+4+5를 계산하면 마지막 두 숫자만 계산이 된다.. 따라서 4+5=9라는 계산결과만 나오고

이 계산기로 계산을 하려면 4+5=9+5=14 이런식으로 2번씩 끊어서 해야한다..

이를 해결해야 하기 위핸 어떻게 해야 할까?

CalculateActivity.zip
0.14MB

 

스토리 안드로이드 앱의 화면 전환 애니메이션 적용기

 

1. Shared Elements Transition이란?

화면과 화면의 공유요소를 통해 하나의 액티비티에서 동작하는 듯한 좀더 자연스러운 사용자 경험을 줄 수 있다.

shared와 다른 효과의 차이는 영상을 통해 비교하여 확인이 가능하다(아래 링크있음)

 

 

첫번째 View1을 클릭하여 ActivityB에 전달한 후 View2로 전달하여 View1과 동일한 위치 및 크기를 설정하여

애니메이션을 시작한다. 마지막으로 ActivitiyC에서 View2의 원래위치 크기로 돌아가여 실행한다.

 

 

2. 적용 방법(Android 5.0이상부터 사용가능)

 

테마의 스타일을 정의할 때 Transition을 추가

sharedElementEnterTransition이 ActivityB에 대한 효과이고 sharedElementExitTransition은 AcitivityA에 대한 효과이다.

 

 

 스타일 테마 등록 후 -> 화면 전환에 사용되는 코드 작성

 

 

위에서 사용한 makeSceneTransitionAnimation의 함수 원형이다.

 

 

스타일 정의(MoveTransition Set)

각각 4가지 transitionSet의 의미:

위치와 크기 변경 / 배열과 회전을 변경 / 지정된 영역 변경 / 이미지 크기 및 배열 변경

 

 

 

마지막으로 이러한 형식으로 transition을 적용하면 된다.

 

 

 

 

3. 카카오스토리 적용 사례

 

FaceTransition은 얼굴 위주로 크롭하여 보여주는 기능(아래 링크 영상참조)-> 끊기지 않고 부드러워짐(매트릭스의 값이 달라지는 것을 막아줌)

 

 

 

 

현재 프레임을 캡쳐하여 비트맵으로 추출하여 사용한다.

 

 

프로필 진입(원에서 사각형으로 변경)

 

4. 이슈 및 해결

이슈1 -모서리의 라운드 이슈

원인 : 모서리의 라운드로 인하여 자연스럽지 않은 문제가 발생

해결 : 별도의 라운드 애니메이션을 적용한다(RoundTransition 생성)

 

 RoundTransition을 구현하기 위해서는 Transition을 상속받아 구현해야 한다

 

Capture(시작과 종료화면을 캡쳐)->저장했던 Transition value가 파라미터로 전달되어 Animator생성에 사용한다

Capture

 -public void captureStartValues(TransitionValues transitionValues)

 -public void captureEndValues(TransitionValues transitionValues)

Animator

 -public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues)



 

 

이슈2 - 연속클릭 이슈

원인 : 연속 클릭으로 인한 애니메이션 오류(startAcitivty 여러번 호출)

해결 : RxJava를 이용해 클릭 이벤트 흐름 제어

 

지속적으로 이벤트를 받아야 함으로 observer를 생성하고 여러개의 뷰에서 하나의 observable로 클릭이벤트를 전달하고

전달받은 함수를 throttleFirst를 통해 이슈 해결

 

 

이슈3 - 공유 뷰의 생성 지연

원인 : 공유 뷰의 생성 지연으로 애니메이션이 동작하지 못하고 화면 전환

해결 : 화면 전환 지연/ 화면 전환 시작 함수를 사용 

PostponedEnterTransition으로 화면 전환을 멈추고 이미지 로드가 완료되면 다시 함수를 호출해 사용하느 ㄴ형식이다.

 

 

 

이슈4 - 종료 위치 찾지 못하는 이슈

원인 : 종료 애니메이션이 위치를 찾지 못하는 문제

해결 : 공유에 사용한 뷰는 사라지지 않도록 관리(ViewPager adapter의 notifyDataSetChanged()를 쓰지 않고 직접

UI에 접근하여 갱신)

 

 

 

 


 

 

포스팅한 내용은 아래 동영상을 참고하여 만들었습니다.

 

 

출처 : if.kakao.com/session/109

 

if(kakao)2020

오늘도 카카오는 일상을 바꾸는 중

if.kakao.com

 

안드로이드 버전 카카오 T SDK 개발기

 

 

이번 주제는 카카오T에 주차서비스를 탑재하는 프로젝트를 다룰 것이다.

카카오 모빌리티에서 카카오T안드로이드 앱을 개발하고 있는 윌슨님의 프로젝트 진행과정에서

기술적인 문제와 문제 해결 방법을 설명하겠다.

카카오 내비에 카카오 모빌리티를 접목시키는 이유?

카카오 모빌리티는 "우리의 기술로 생활을 움직입니다"라는 비젼을 바탕으로 다양한 모빌리티 서비스를 제공한다.

카카오 내비가 제공하는 서비스를 생각해보자.

운전자는 목적지까지 원하는 경로로 이동한다. 하지만 주차 공간은 내비가 제공하지 못한다!

따라서 카카오 모빌리티의 또다른 서비스(주차)를 접목시킨다면 운행을 잘 마무리 할 수 있다.

 

 

 

카카오T주차는 사전예약과 자동정산의 서비스를 제공한다.

 

따라서 카카오 내비에 카카오T주차에 자동정산 서비스를 연동하는 프로젝트를 시행하였다.

이 프로젝트는 카카오T주차 서비스를 SDK로 만들어서 내비 앱에 탑재한다.

이를 통해 지속적으로 업데이트를 하여 배포할 수 있다.

 

 

SDK설계 과정

주차,대리,택시 모듈 : 개별 서비스 제공

플러그인 모듈 : 플랫폼성 기능에 인터페이스 선언

앱 모듈 : 인터페이스의 구현체를 제공

Base 모듈 : 각종 유틸리티 코드 

 

 

 

만약 주차 모듈이 동작하려면 주차 모듈이 의존하는 모듈( 플러그인,Base모듈)이 필요하다. 하지만 플러그인의 인터페이스를 실질적으로 구현하는 앱 모듈이 필요하다.

따라서 새로운 모듈인 코어 SDK 모듈이 필요하다.

1번은 빠르긴 하나 2번이 모듈로 재사용이 가능하기 때문에 유지보수하기에 적합하다.

 

 

 

주차 모듈 이외에 다른 모듈 또한 코어SDK 모듈을 사용할 가능성이 있기 때문에 직접 접근하는 방식이 아니라

주차SDK 모듈을 만든 후 연결시켜 주었다.

 

구현단계 문제

인증 문제 : 사용자 인증이 필요(로그인) 앱로그인과 별개로 SDK에서 또한 로그인이 필요하다. 따라서 앱에서 로그인한 정보를 이용해 SDK에서 사용자 인증을 연동시키게 한다. 카카오 계정을 기반으로 관리하기 때문에 두개의 매핑이 가능하다.

푸쉬 문제 : 자동정산 서비스는 주차장 입차/출차 문제를 푸쉬로 발송한다. 앱은 푸쉬를 하지만 sdk에서 푸쉬를 한다? 말이 안된다. 결국 내비 앱과 내비 서버를 의존한다. 주차서버가 내비 서버에 푸쉬발송요청 API를 호출한다.  그 이후 아래와 같은 절차를 밟는다.

 

 

이후 2019년 7월 말부터 앱을 배포하고 서비스를 시행했다.

 

서비스 시작 후 작업을 할 때마다 카카오T와 카카오T SDK를 이중으로 코드를 수정해야 함. 따라서 이와 같은 모듈을 분리하여 코드를 쉽게 유지보수할 수 있다.

 

 


 

포스팅한 내용은 아래의 동영상을 참고하여 만들었습니다.

 

 

출처 : if.kakao.com/session/58

 

if(kakao)2020

오늘도 카카오는 일상을 바꾸는 중

if.kakao.com

 

 

DatePickerDialog

- 날짜 정보를 보여준다.

TimePickerDialog

- 시간 정보를 보여준다.

 

각자 TIME 과 DATE 버튼을 눌렀을 때 PickerDialog가 동작하여 시간/날짜 설정후 TextView로 보여주는 과정

 

 

xml에서 android:onClick="mOnClick"을 넣어줘야 함

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnSelectData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="91dp"
        android:text="Date"
        android:onClick="mOnClick"
        app:layout_constraintBaseline_toBaselineOf="@+id/btnSelectTime"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/btnSelectTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="44dp"
        android:layout_marginEnd="44dp"
        android:text="Time"

        android:onClick="mOnClick"
        app:layout_constraintEnd_toStartOf="@+id/btnSelectData"
        app:layout_constraintTop_toBottomOf="@+id/textResult" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

updateResult()함수를 통해 textView에 결과값을 나타낸다.


public class MainActivity extends AppCompatActivity {

    private String mStrDate ="date";
    private String mStrTime ="time";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        updateResult();
        Button btnDate = (Button)findViewById(R.id.btnSelectData);
        Button btnTime = (Button)findViewById(R.id.btnSelectTime);
    }

    private void updateResult(){
        TextView textResult = (TextView)findViewById(R.id.textResult);
        textResult.setText("날짜 : "+mStrDate +"\n"+ "시간 : "+mStrTime);
    }
    public void mOnClick(View v){
        Calendar calendar = Calendar.getInstance();
        switch (v.getId()){
            case R.id.btnSelectData:
                int year = calendar.get(Calendar.YEAR);
                int month = calendar.get(Calendar.MONTH);
                int day = calendar.get(Calendar.DAY_OF_MONTH);
                new DatePickerDialog(this,mDateSetListener,year,month,day).show();
                break;
            case R.id.btnSelectTime:
                int hour = calendar.get(Calendar.HOUR_OF_DAY);
                int minute = calendar.get(Calendar.MINUTE);
                new TimePickerDialog(this,mTimeSetListener,hour,minute,true).show();
                break;
        }
    }
    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener(){

        @Override
        public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) {
            mStrDate = String.format("%d년 %d월 %d일",year,month+1,dayOfMonth);
            updateResult();
        }
    };
    private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
                  mStrTime= String.format("%d시 %d분",hourOfDay,minute);
                  updateResult();
        }
    };

}

 

 

처음 실행 모습

 

 

TIME버튼 눌렀을 때

 

 

 

DATE버튼 눌렀을 때

 

 

바뀐 TextView

 

 

CustomListView 코틀린 전환하기

 

 

 

CustomListView를 java에서 사용하는 방법

2020/10/27 - [대외 활동/CADI(개발A 보충스터디)] - CustomListView - 1(java)

 

CustomListView - java

CustomListView 구현 CustomListview는 아이템을 별도의 xml로 만들고 그것을 Listview에 적용시켜서 사용하는 것이다. 간단한 문장이나 하나의 아이템만 보여주는 Listview와 달리 아이템을 더 추가하여 리스

dev-seungwon.tistory.com

 

 

 

위의 코드에서 xml부분은 동일하다. 따라서 java->kt파일로 변환된 모습만 살펴보자.

 

 

동일하게 총 3개의 .kt파일을 만들고 기능은 java와 같다.

 

 

 

Adapter에서의 핵심은 findViewById()함수를 사용해 선언할 필요가 없다는 점과 java와 비교하여 보다 간결해진 코드이다.

 

 

ListViewAdpater.kt

class ListViewAdapter : BaseAdapter() {
private val listViewItemList : List<ListViewItem>()
    override fun getCount(): Int {
        return listViewItemList.size
    }

    override fun getItem(position: Int): Any {
        return listViewItemList[position]
    }

    override fun getItemId(position: Int): Long
    {
        return position.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        var convertView = convertView
        val pos = position
        val context = parent!!.context

        if (convertView == null)
        {
            val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
            convertView = inflater.inflate(R.layout.listview_item, parent, false)
        }

        val listViewItem: User = listViewItemList[pos]

        convertView!!.imageView1.setImageDrawable(listViewItem.icon)
        convertView.tv_title.text = listViewItem.title
        convertView.tv_desc.text = listViewItem.desc
        
        return convertView
    }
    
    fun addItem(icon: Drawable?, title: String?, desc: String?) {
        val item = ListViewItem() // 하나의 리스트 항목을 하나의 객체로 간주함
        item.title
        item.desc
        item.icon
        listViewItemList.add(item)
    }


}

 

 

 

 

MainActivity와 ListViewItem부분도 코드가 간결해졌다.

 

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val listview: ListView
        val adapter = ListViewAdapter()

         listview = findViewById<View>(R.id.listView_Shape) as ListView
        listview.adapter = adapter

        // 첫 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.instagram), "instagram", "this is instagram")

        // 두 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.youtube), "youtube", "this is youtube")

        // 세 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.facebook), "facebook", "this is facebook")

        listview.onItemClickListener =
            OnItemClickListener { parent, v, position, id ->
                val item: ListViewItem = parent.getItemAtPosition(position) as ListViewItem
                Toast.makeText(applicationContext, item.title, Toast.LENGTH_LONG).show()
            }
    }
}

 

 

ListViewItem.kt

class ListViewItem() {
    val icon: Drawable? =null
    val title: String? =null
    val desc: String?=null
}

 

 

 

실행결과 java버전과 똑같이 나온다.

 

CustomListView를 사용하는 방법을 알아보았다.

2020/10/27 - [대외 활동/CADI(개발A 보충스터디)] - CustomListView - java

 

CustomListView - java

CustomListView 구현 CustomListview는 아이템을 별도의 xml로 만들고 그것을 Listview에 적용시켜서 사용하는 것이다. 간단한 문장이나 하나의 아이템만 보여주는 Listview와 달리 아이템을 더 추가하여 리스

dev-seungwon.tistory.com

하지만 ViewHolder를 사용하지 않았을 때의 문제는 list에 추가될때마다 새롭게 view들을 다시 만든다는 것이다.

setTag/getTag를 통해 FindViewByID()를 하지 않아도 이용할 수 있다.

 

우선 위의 예제에서 ViewHolder 클래스와 몇가지 기능만 바꾸면 된다. 따라서 위의 CustomListView구현 방법을 알고 난 후 추가하면 된다.

 

먼저 ViewHolder클래스를 하나 생성한 후

 

ViewHolder에는 각 컴포넌트의 View 원형을 정의하면 된다.

ViewHolder.java

이후 ListViewAdapter에서 이 부분만 수정하면 끝난다.

holder를 convertView가 만들어질 때에만 생성하게 하기 때문에 위에서 말한 findViewById를 계속 호출하지 않아도 된다는 장점을 가지고 있다

 

 

결과는 똑같이 나옴

 

+ Recent posts