728x90
반응형
일단 adapterView 순서대로 만들어보자
1. Lagacy -> ListView 만들기
2. layout 구성하기
3.
데이터를 ArrayList에 저장해야하는데
데이터가 3개, 데이터 타입이 다 달라서
VO ( Value Object, 사용자 정의 자료형 ) 설계를 해서 VO타입으로 사용해야함
■ContantVO
package com.kmg.ex0325_adapter_custom;
public class ContactVO {
// 1. 필드
// 2. 생성자
// 3. get/set
// 4. toString
private int imgID;
private String name;
private String phone;
public ContactVO() {
}
public ContactVO(int imgID, String name, String phone) {
this.imgID = imgID;
this.name = name;
this.phone = phone;
}
public int getImgID() {
return imgID;
}
public void setImgID(int imgID) {
this.imgID = imgID;
}
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{" +
"imgID=" + imgID +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
public class MainActivity extends AppCompatActivity {
ArrayList<ContactVO> contacts = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contacts.add(new ContactVO(R.drawable.img1, "철수","010-1111-1111"));
contacts.add(new ContactVO(R.drawable.img2, "맹구","010-2222-2222"));
contacts.add(new ContactVO(R.drawable.img3, "훈발놈","010-3333-3333"));
contacts.add(new ContactVO(R.drawable.img4, "짱구","010-4444-4444"));
contacts.add(new ContactVO(R.drawable.img5, "유리","010-5555-5555"));
//ArrayAdapter 는 simplelist.xml 에 textView 단독으로 있을때만 사용가능
// 지금은 contactList.xml에 custom 했기 때문에 ArrayAdapter 사용 불가능
// 해결방법 - Adapter 도 Custom 해야함
}
}
Java Class 를 하나 만들어서VO타입의 ArrayList에 정보를 저장한다
ArrayAdapter 는 항목xml이 textview였을때만 사용가능해서 Adapter도 custom해야함
▼
CustomApater이라는 이름의 Java클래스를 하나 만든다
inflate는 Activity에서 밖에 할 수 없어서 Java에서 inflater를 사용해서 Context에서 추출한다
■contactAdapter
// 1. BaseAdapter 를 상속받는다
// 2. BaseAdapter 는 추상 클래스(추상메소드(몸체가 없는 메소드)가 하나이상 포함되어 있는 클래스)
// 이기 때문에 내장돼있는 추상메소드를 반드시 Override 해줘야함
// 3. Adapter 작업에 필요한 도구를 전달(생성자 통해서) 받아야함
// 4. 전달받은 도구 (context, layout, data)를 field 변수에 저장
public class ContactAdapter extends BaseAdapter {
private Context c;
private int layout;
private ArrayList<ContactVO> data;
private LayoutInflater inflater; // 주소값 -> View
public ContactAdapter(Context c, int layout, ArrayList<ContactVO> data){
this.c = c;
this.layout = layout;
this.data = data;
this.inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate 에 필요한 객체 inflater 를 Context 에서 추출한다
// Context 중에있는 service 를 추출해오라고 한것 , 내가 필요한 것을 가져오기위해 다운캐스팅
}
@Override
public int getCount() { // ListView 에 보여질 항목의 개수를 결정
return data.size();
}
@Override
public Object getItem(int position) { // position 번째의 데이터를 반환
return data.get(position);
}
@Override
public long getItemId(int position) { // position 번째의 id 값을 반환
return position;
}
// ★ Adapter 의 핵심 (모든일은 여기서 처리됨)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){ // 이전에 만들어진 View가 없다면
convertView = inflater.inflate(layout, parent, false);
//종속성 - parent 를 layout 에 종속시킬건지
// position - 지금 inflate 하고있는 View 의 인덱스
// convertView - 이전에 inflate 된 View (이전에 만들어진 View)
// parent - 리스트 뷰 자체
// layout -> view 로 만들고 싶은 xml 의 주소값
// parent -> view 가 적재될 listView
// false -> parent 에 대한 종속성
}
// 1.Layout 을 inflate 시켜 View 로 만든다.
// 2.ArrayList 에 들어있는 데이터 꾸미기
// 3.완성된 View 를 return 하여 ListView 에 한칸씩 추가한다.
// getView 는 항목 하나를 만들 때마다 호출
// 항목을 만들 때 마다 템플릿을 inflate 해버리면 부하가 거려서 버벅거릴 수 있음
// 최초 1번만 inflate 하고 만들어진 view 를 재활용
ImageView img = convertView.findViewById(R.id.imageView);
img.setImageResource(data.get(position).getImgID());
TextView tv_name = convertView.findViewById(R.id.tv_name);
tv_name.setText(data.get(position).getName());
TextView tv_phone = convertView.findViewById(R.id.tv_phone);
tv_phone.setText(data.get(position).getPhone());
return convertView;
}
}
■Main
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<ContactVO> contacts = new ArrayList<>();
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = findViewById(R.id.listView);
// Arraylist 에 연락처 정보 5개추가
/*ContactVO vo1 = new ContactVO(R.drawable.img1, "장승원","010-1111-1111");
ContactVO vo2 = new ContactVO(R.drawable.img2, "김명훈","010-2222-2222");
ContactVO vo3 = new ContactVO(R.drawable.img3, "박양주","010-3333-3333");
ContactVO vo4 = new ContactVO(R.drawable.img4, "여진호","010-4444-4444");
ContactVO vo5 = new ContactVO(R.drawable.img5, "김민관","010-5555-5555");
contacts.add(vo1);
contacts.add(vo2);
contacts.add(vo3);
contacts.add(vo4);
contacts.add(vo5);*/
contacts.add(new ContactVO(R.drawable.img1, "철수","010-1111-1111"));
contacts.add(new ContactVO(R.drawable.img2, "맹구","010-2222-2222"));
contacts.add(new ContactVO(R.drawable.img3, "훈발놈","010-3333-3333"));
contacts.add(new ContactVO(R.drawable.img4, "짱구","010-4444-4444"));
contacts.add(new ContactVO(R.drawable.img5, "유리","010-5555-5555"));
ContactAdapter adapter = new ContactAdapter(getApplicationContext(), R.layout.contaclist, contacts);
// ContactAdapter 불러오기
lv.setAdapter(adapter);
// adapter설정
//ArrayAdapter 는 simplelist.xml 에 textView 단독으로 있을때만 사용가능
// 지금은 contactList.xml에 custom 했기 때문에 ArrayAdapter 사용 불가능
// 해결방법 - Adapter 도 Custom 해야함
}
}
반응형
'Android' 카테고리의 다른 글
서버 통신 로그인 DB연동( Volley 라이브러리 ) (0) | 2021.04.03 |
---|---|
Custom ListView + DB연동하기 ( SQLite ) (0) | 2021.04.03 |
Adapter View (0) | 2021.03.24 |
Intent 사용 2 (0) | 2021.03.23 |
Intent 사용하기 (0) | 2021.03.22 |