05.13 AdapterView

최고고·2022년 5월 13일
0


어댑터 뷰를 새롭게 만들어서 ㅋㅌ을 흉내내보려한다


레이아웃을 살펴보면 크게 세개로 나뉘어있고 각 이미지, 텍스트뷰2, 노래텍스트1로 구성됨

뷰는 이런식으로 지정되어있음..

이미지, 텍스트2개(이름,상메), 노래텍스트 ---> 한번에 묶을 VO를 만들어줘야됨

빈 xml을 만들어 리스트뷰를 만들어주고



프사로 해줄 이미지 5개 넣음

자바 클래스 만듦 ---- VO

  • 게터세터, 생성자 만드는 단축키 alt + insert
package com.example.ex220513;

import android.graphics.drawable.Drawable;

public class KakaoVO {
    private Drawable img;
    private  String name;
    private String message;
    private String music;

    public  KakaoVO(){}

    public KakaoVO(Drawable img, String name, String message, String music) {
        this.img = img;
        this.name = name;
        this.message = message;
        this.music = music;
    }

    @Override
    public String toString() {
        return "KakaoVO{" +
                "img=" + img +
                ", name='" + name + '\'' +
                ", message='" + message + '\'' +
                ", music='" + music + '\'' +
                '}';
    }

    public Drawable getImg() {
        return img;
    }

    public void setImg(Drawable img) {
        this.img = img;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMusic() {
        return music;
    }

    public void setMusic(String music) {
        this.music = music;
    }
}

자바클래스 하나 더 만듦 --- Adapter

VO담을 어댑터 생성 BaseAdapter 상속

extends 하게 되면 빨간줄 오류가 나오는데, alt enter로 확인하거나 마우스 가져다대면 아래같이 오버라이딩 하라고 뜸


오버라이딩ㅇㅋ 해줌

  • vo를 담을 ArrayList를 필드 선언

  • java파일에서 사용할 메소드 addItem(Drawable img, String name, String message, String music) 생성
    vo타입 객체 만들고, 인자로 img, name, message,music 넣어줌
    vo를 ArrayList items에 add 해줌

  • 오버라이딩 getCount() : 어댑터가 가지고 있는 아이템의 개수를 알려주는 메소드

  • getItem(int i) : 어댑터에게 해당 i 번째의 아이템을 요청하는 메소드 (선택한 아이템)
    return items.get(i); : 리턴 Object: 업캐스팅 - 형변환됨

  • getItemId(int i) : 안중요함 안씀, 그냥 i 리턴
    return i;

  • getView(int i, View view, ViewGroup viewGroup) : Adapter가 가지고 있는 item만큼 만들어놓은xml틀에 맞게 넣어주는 메소드, 필수 구현!
    만들어놓은 xml 불러오기 -> 불러와서 위에 구현해놓은 item 넣어줘야됨
    Context context = viewGroup.getContext();
    return view; : 리스트뷰에 들어간 모든 정보인 view 반환

package com.example.ex220513;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

// VO담을 어댑터 생성 BaseAdapter 상속

public class KakaoAdapter extends BaseAdapter {
    private ArrayList<KakaoVO> items = new ArrayList<KakaoVO>();

    // VO가져와서 ArrayList 담아줌
    public void addItem(Drawable img, String name, String message, String music){
        KakaoVO vo = new KakaoVO(img,name,message,music);
        items.add(vo);
    }

    @Override
    public int getCount() {
        //어댑터가 가지고 있는 아이템의 개수를 알려주는 메소드

        return items.size();
    }

    @Override
    public Object getItem(int i) {
        // 어댑터에게 해당 i 번째의 아이템을 요청하는 메소드 (선택한 아이템)

        return items.get(i); // 리턴 Object: 업캐스팅 - 형변환됨
    }

    @Override
    public long getItemId(int i) {      // 안중요함 안씀, 그냥 i 리턴
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        //Adapter가 가지고 있는 item만큼 만들어놓은xml틀에 맞게 넣어주는 메소드, 필수 구현!
        // 만들어놓은 xml 불러오기 -> 불러와서 위에 구현해놓은 item 넣어줘야됨

        Context context = viewGroup.getContext();
        if(view == null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //레이아웃이 정의 안되어있기 때문에
            view = inflater.inflate(R.layout.kakao,viewGroup,false);

        }
        ImageView img = view.findViewById(R.id.img);
        TextView tv_name = view.findViewById(R.id.tv_name);
        TextView tv_message = view.findViewById(R.id.tv_message);
        TextView tv_music = view.findViewById(R.id.tv_music);

        KakaoVO vo = items.get(i);  //아이템즈는 i에 담김
        img.setImageDrawable(vo.getImg());
        tv_name.setText(vo.getName());
        tv_message.setText(vo.getMessage());
        tv_music.setText(vo.getMusic());

        return view;        //리스트뷰에 들어간 모든 정보
    }
}

xml - java 파일로 고고



만들어놓은 어댑터 호출하고,
실행시 나오는 화면에 어댑터 통해 리스트뷰 불러옴
클릭시 토스트메시지 나오게하기 -> setOnItemClickListener 익명클래스

package com.example.ex220513;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

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

public class MainActivity2 extends AppCompatActivity {
    private ListView listView;
    private KakaoAdapter adapter = new KakaoAdapter();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        listView = findViewById(R.id.kakaoListView);
        adapter.addItem(ContextCompat.getDrawable(this,R.drawable.img1),"육전",
                "육전입니다","TomBoy-(G)-IDLE ▶");
        adapter.addItem(ContextCompat.getDrawable(this,R.drawable.img2),"육회1",
                "육회입니다","LOVE DIVE-ive ▶");
        adapter.addItem(ContextCompat.getDrawable(this,R.drawable.img3),"육회2",
                "육회입니다2","HelloFuture-nct dream ▶");
        adapter.addItem(ContextCompat.getDrawable(this,R.drawable.img4),"마라탕",
                "마라탕입니다","Ready to love-세븐틴 ▶");
        adapter.addItem(ContextCompat.getDrawable(this,R.drawable.img5),"차돌박이",
                "바삭바삭","버퍼링-nct dream ▶");
        listView.setAdapter(adapter);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                KakaoVO vo = (KakaoVO) adapterView.getItemAtPosition(i);
                Toast.makeText(getApplicationContext(), vo.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

완성화면:

0개의 댓글