ContactActivity
package com.example.ex0414;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class ContactActivity extends AppCompatActivity {
ListView lvContact;
ContactAdapter adapter;
ArrayList<ContactVO> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact);
lvContact = findViewById(R.id.lvContact);
list = new ArrayList<ContactVO>();
for(int i =0; i<20; i++){
list.add(new ContactVO(R.drawable.ic_launcher_background,
"스인개"+(i+1),"010-1234-123"+i ));
}
adapter = new ContactAdapter(
ContactActivity.this,
R.layout.list_item,
list);
lvContact.setAdapter(adapter);
}
}
list = new ArrayList<ContactVO>();
사용자가 원하는 데이터 형식과 타입을 담기위해 ArrayList를 선언하고 들어갈 데이터들을 저장시킨 VO를 형식으로 담는다. list.add(new ContactVO(R.drawable.ic_launcher_background,
"스인개"+(i+1),"010-1234-123"+i ));
}
반복문을 이용하여 선언한 ArrayList에 추가한다. adapter = new ContactAdapter(
ContactActivity.this,
R.layout.list_item,
list);
lvContact.setAdapter(adapter);
선언한 ContactAdapter를 연결한다(표시할 Activity,커스텀한 layout,데이터)어뎁터의 역할
ContactAdapter.class
package com.example.ex0414;
import android.app.LauncherActivity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class ContactAdapter extends BaseAdapter {
Context context;
//R.~~~ 는 정수형으로 변환시켜준다고 생각하면 된다.
int layout;
//여러형태의 데이터를 담기때문에
ArrayList<ContactVO> list;
//xml 파일 -> View 객체로 변환해주는 객체, 중요
LayoutInflater inflater;
public ContactAdapter(Context context, int layout, ArrayList<ContactVO> list) {
this.context = context;
this.layout = layout;
this.list = list;
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return list.size();
}
@Override
//선택한 인덱스의 내용물?
public Object getItem(int i) {
return list.get(i);
}
@Override
//선택한 인덱스를 반환하는 부분
public long getItemId(int i) {
return i;
}
@Override
//직접적으로 구현해야되는 부분
// i는 인덱스 역할, view는 layout에 대한 정보를 보관해줄 객체, ViewGroup은 리스트 뷰 어뎁터
public View getView(int i, View view, ViewGroup viewGroup) {
//아이템 뷰에 배치된 View객체들을 한 번 초기화
ViewHolder holder = null;
// list_item.xml -> View 객체로 변환
if(view ==null){
view = inflater.inflate(layout, viewGroup, false);
holder = new ViewHolder(view);
//초기화된 holder 객체를 view객체에 태그로 저장,setTag는 저장시키는 것
view.setTag(holder);
}else{
//view객체에 저장된 holder객체를 가져와서 저장장
holder = (ViewHolder) view.getTag();
}
//list_item.xml 안에 있는 ImageView, Textview, Button 초기화
// ImageView imageView = view.findViewById(R.id.imageView2);
// ImageButton btnCall = view.findViewById(R.id.call);
// TextView tvName = view.findViewById(R.id.name);
// TextView tvPhone = view.findViewById(R.id.phone);
//생성한 View 객체를 활용
// ContactVO vo = (ContactVO) getItem(i);
// imageView.setImageResource(vo.getImg());
// tvName.setText(vo.getName());
// tvPhone.setText(vo.getPhone());
ContactVO vo = (ContactVO) getItem(i);
holder.getImageView().setImageResource(vo.getImg());
holder.getTvName().setText(vo.getName());
holder.getTvPhone().setText(vo.getPhone());
holder.getBtnCall().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//context = ContactActivity를 가리킴
Toast.makeText(context,vo.getPhone(),Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context,MainActivity.class);
//ContactAdapter는 액티비티가 아닌 일반클래스이기 때문에
//액티비티에서만 사용할 수 있는 메소드를 바로 호출이 불가능
// 사용하려면 액티비티 정보를 가진 Context 객체를 통해서 사용가능!
context.startActivity(intent);
}
});
//생성된 Layout View객체를 리턴 -> listView에 출력
return view; //젤 중요
}
}
코드 해석
Context context;
int layout;
ArrayList<ContactVO> list;
LayoutInflater inflater;
public ContactAdapter(Context context, int layout, ArrayList<ContactVO> list) {
this.context = context;
this.layout = layout;
this.list = list;
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
매개변수로 받아온 데이터들을 ConcactAdapter 초기화 시킨다.
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
해당 부분들을 반환시킨다.( 크기, 해당 인덱스의 데이터, 인덱스 아이디값)
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
//아이템 뷰에 배치된 View객체들을 한 번 초기화
ViewHolder holder = null;
// list_item.xml -> View 객체로 변환
if(view ==null){
view = inflater.inflate(layout, viewGroup, false);
holder = new ViewHolder(view);
//초기화된 holder 객체를 view객체에 태그로 저장,setTag는 저장시키는 것
view.setTag(holder);
}else{
//view객체에 저장된 holder객체를 가져와서 저장장
holder = (ViewHolder) view.getTag();
}
//list_item.xml 안에 있는 ImageView, Textview, Button 초기화
// ImageView imageView = view.findViewById(R.id.imageView2);
// ImageButton btnCall = view.findViewById(R.id.call);
// TextView tvName = view.findViewById(R.id.name);
// TextView tvPhone = view.findViewById(R.id.phone);
//생성한 View 객체를 활용
// ContactVO vo = (ContactVO) getItem(i);
// imageView.setImageResource(vo.getImg());
// tvName.setText(vo.getName());
// tvPhone.setText(vo.getPhone());
ContactVO vo = (ContactVO) getItem(i);
holder.getImageView().setImageResource(vo.getImg());
holder.getTvName().setText(vo.getName());
holder.getTvPhone().setText(vo.getPhone());
holder.getBtnCall().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//context = ContactActivity를 가리킴
Toast.makeText(context,vo.getPhone(),Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context,MainActivity.class);
//ContactAdapter는 액티비티가 아닌 일반클래스이기 때문에
//액티비티에서만 사용할 수 있는 메소드를 바로 호출이 불가능
// 사용하려면 액티비티 정보를 가진 Context 객체를 통해서 사용가능!
context.startActivity(intent);
}
});
//생성된 Layout View객체를 리턴 -> listView에 출력
return view; //젤 중요
}
}
직접적으로 구현해야되는 부분
i는 인덱스 역할, view는 layout에 대한 정보를 보관해줄 객체, ViewGroup은 리스트 뷰 어뎁터
ConcactVO.class
```
package com.example.ex0414;
public class ContactVO {
private int img;
private String name;
private String phone;
public ContactVO(){}
public ContactVO(int img, String name, String phone) {
this.img = img;
this.name = name;
this.phone = phone;
}
public int getImg() {
return img;
}
public void setImg(int img) {
this.img = img;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "ContactVO{" +
"img=" + img +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
ListView에 넣을 데이터들을 초기화하거나 값을 불러올 때 사용한다.
Viewholder
package com.example.ex0414;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
//아이탬뷰에 배치된
public class ViewHolder {
private ImageView imageView;
private TextView tvName;
private TextView tvPhone;
private ImageButton btnCall;
public ViewHolder(View itemView){
imageView = itemView.findViewById(R.id.imageView2);
btnCall = itemView.findViewById(R.id.call);
tvName = itemView.findViewById(R.id.name);
tvPhone = itemView.findViewById(R.id.phone);
}
public ImageView getImageView() {
return imageView;
}
public TextView getTvName() {
return tvName;
}
public TextView getTvPhone() {
return tvPhone;
}
public ImageButton getBtnCall() {
return btnCall;
}
}
커스텀 ListView의 각 속성값들을 초기화하고 해당 부분들을 반환한다.