연습하면서 만든 리스트뷰에다 진행했다.
리스트뷰의 아이템을 클릭했을 때 이벤트처리를 해보자
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를 형변환해서 사용한다.
이렇게 하면 효율적으로 사용할 수 있다.