리스트뷰 아이템 선택

OneTwoThree·2022년 8월 10일

링크텍스트

아이템 선택 리스너 등록

연습하면서 만든 리스트뷰에다 진행했다.
리스트뷰의 아이템을 클릭했을 때 이벤트처리를 해보자

package com.example.practice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    MyAdapter adapter;

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

        ListView listView = (ListView) findViewById(R.id.listView);

        adapter = new MyAdapter();

        adapter.addItem(new Champion("손흥민","LW","감아차기"));
        adapter.addItem(new Champion("케인","ST","마무리"));
        adapter.addItem(new Champion("클루셉스키","RM","수비가담"));
        adapter.addItem(new Champion("메시","RW","드리블"));
        adapter.addItem(new Champion("호날두","bench","노쇼"));



        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Champion item = (Champion) adapter.getItem(i);
                Toast.makeText(getApplicationContext(),"선택 : "+item.toString(),Toast.LENGTH_LONG).show();
                

            }
        });




    }

    class MyAdapter extends BaseAdapter{

        ArrayList<Champion> arrayList = new ArrayList<Champion>();

        public void addItem(Champion item){
            arrayList.add(item);
        }

        @Override
        public int getCount() {
            return arrayList.size();
        }

        @Override
        public Object getItem(int i) {
            return arrayList.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            ChampView itemView = new ChampView(getApplicationContext());

            Champion champ = arrayList.get(i);
            itemView.setName(champ.getName());
            itemView.setPoistion(champ.getPosition());
            itemView.setSpecial(champ.getSpecial());



            return itemView;
        }
    }



}

리스트뷰에 setOnItemClickListener 메소드로 리스너를 등록해준다.
아이템이 클릭되면 onItemClick 메소드가 호출된다.
어댑터에서 선택한 인덱스의 아이템을 가져와서 toString 메소드 내용을 토스트 메시지로 표시해준다.

사용자 입력으로 아이템 만들기

<?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">


    <ListView
        android:id="@+id/listView"
        android:layout_width="266dp"
        android:layout_height="412dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.496"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.893" />

    <LinearLayout
        android:layout_width="360dp"
        android:layout_height="168dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toTopOf="@+id/listView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.49"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.871">

        <EditText
            android:id="@+id/editTextTextPersonName1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="이름"
            />

        <EditText
            android:id="@+id/editTextTextPersonName2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="포지션" />

        <EditText
            android:id="@+id/editTextTextPersonName3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="특징" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button" />
    </LinearLayout>


</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml에 버튼과 plainText 3개를 추가했다.
정보를 입력받기 위함이다.

package com.example.practice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    MyAdapter adapter;

    EditText editText1;
    EditText editText2;
    EditText editText3;


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

        editText1 = (EditText)findViewById(R.id.editTextTextPersonName1);
        editText2 = (EditText)findViewById(R.id.editTextTextPersonName2);
        editText3 = (EditText)findViewById(R.id.editTextTextPersonName3);
        Button button = findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name = editText1.getText().toString();
                String position = editText2.getText().toString();
                String special = editText3.getText().toString();

                adapter.addItem(new Champion(name,position,special));
                adapter.notifyDataSetChanged();

            }
        });


        ListView listView = (ListView) findViewById(R.id.listView);

        adapter = new MyAdapter();

        adapter.addItem(new Champion("손흥민","LW","감아차기"));
        adapter.addItem(new Champion("케인","ST","마무리"));
        adapter.addItem(new Champion("클루셉스키","RM","수비가담"));
        adapter.addItem(new Champion("메시","RW","드리블"));
        adapter.addItem(new Champion("호날두","bench","노쇼"));



        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Champion item = (Champion) adapter.getItem(i);
                Toast.makeText(getApplicationContext(),"선택 : "+item.toString(),Toast.LENGTH_LONG).show();


            }
        });




    }

    class MyAdapter extends BaseAdapter{

        ArrayList<Champion> arrayList = new ArrayList<Champion>();

        public void addItem(Champion item){
            arrayList.add(item);
        }

        @Override
        public int getCount() {
            return arrayList.size();
        }

        @Override
        public Object getItem(int i) {
            return arrayList.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            ChampView itemView = new ChampView(getApplicationContext());

            Champion champ = arrayList.get(i);
            itemView.setName(champ.getName());
            itemView.setPoistion(champ.getPosition());
            itemView.setSpecial(champ.getSpecial());



            return itemView;
        }
    }






}

MainActivity.java에서 findViewbyId로 입력창 3개와 버튼을 변수에 저장한다.
그리고 버튼에 리스너를 등록한다.
각 입력창의 내용을 가져와서 변수에 저장하고 이를 이용해서 챔피언 객체를 만든다.
이 객체를 addItem으로 추가해준다.
그리고 추가하고 나서 갱신해주기 위해 notifyDatabaseChanged 메소드를 호출한다.

아이템 뷰 재사용

실무에서 리스트 뷰를 쓴다면 여기서 약간 바꿔줘야 한다.

 @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            ChampView itemView = new ChampView(getApplicationContext());

            Champion champ = arrayList.get(i);
            itemView.setName(champ.getName());
            itemView.setPoistion(champ.getPosition());
            itemView.setSpecial(champ.getSpecial());



            return itemView;
        }

아답터의 getView 메소드인데 실제로는 뷰가 매우 많을 수 있다.
모든 뷰를 new로 만들면 메모리 소모가 엄청나다.
화면에 한번에 보이는 뷰는 10~ 개 근처로 보이는데
이정도만 만들고 화면에 안보이게 된 뷰를 재사용 해주면 된다.

 @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            ChampView itemView = null;
            if (view==null){
                itemView = new ChampView(getApplicationContext());
            } else {
                itemView = (ChampView) view;
            }

            Champion champ = arrayList.get(i);
            itemView.setName(champ.getName());
            itemView.setPoistion(champ.getPosition());
            itemView.setSpecial(champ.getSpecial());



            return itemView;
        }

매개변수 view는 이미 썼던 뷰를 의미한다.
null 일 경우 new로 새로 만들지만 아닐 경우 이미 있기 때문에 view를 형변환해서 사용한다.
이렇게 하면 효율적으로 사용할 수 있다.

0개의 댓글