본문 바로가기
Android

Adapter -> Custom ListView활용

by noddu 2021. 3. 25.
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