본문 바로가기
Android

안드로이드 스튜디오,JAVA] 커스텀 리스트뷰에 이미지 넣기

by 김마리님 2020. 7. 23.

https://itstudy-mary.tistory.com/207

 

안드로이드 스튜디오, JAVA] 커스텀 리스트뷰(ListView) 만들기

https://itstudy-mary.tistory.com/206 안드로이드 스튜디오, JAVA] 기본 리스트뷰(ListView) 만들기 기본적으로 안드로이드는 ListView를 기본적으로 제공한다. 리스트뷰가 무엇이냐면, 보면 Aㅏ 한다. 결과 : 구.

itstudy-mary.tistory.com

 

지난 포스트에서 리스트뷰를 안드로이드에서 제공하는 것이 아니라 직접 제작했었다.

이제 이 리스트에 사진을 받아서 리스트마다 이미지를 변화시킨다.

 

결과 :

 

 

먼저 Resource에 사진 파일을 추가하고

우리가 지난 포스트에 만들었던 리스트 디자인에서 이미지뷰 하나를 추가한다.

 

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <ImageView
        android:id="@+id/iv_img_resource"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:src="@drawable/mov01"
        android:layout_alignParentLeft="true"
        android:scaleType="centerCrop"/>

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="99dp"
        android:text="^-^"
        android:textSize="30sp"
        android:textStyle="bold"
        android:gravity="center"/>

    <View
        android:layout_below="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#505050"/>

</RelativeLayout>

 

 

그리고 이걸 변화시킬 어댑터를 만든다.

 

SingleAdapter. java

package com.mary.movieapp;

import android.media.Image;
import android.util.Log;
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;
import java.util.List;

public class SingleAdapter extends BaseAdapter {
    private static final String TAG = "SingleAdapter";

    private List<Movie> items=new ArrayList<>();

    public SingleAdapter() {
        items.add(new Movie("써니",R.drawable.mov01));
        items.add(new Movie("완득이",R.drawable.mov02));
        items.add(new Movie("괴물",R.drawable.mov03));
        items.add(new Movie("라디오스타",R.drawable.mov04));
        items.add(new Movie("비열한 거리",R.drawable.mov05));
        items.add(new Movie("왕의 남자",R.drawable.mov06));
        items.add(new Movie("아일랜드",R.drawable.mov07));
        items.add(new Movie("웰컴 투 동막골",R.drawable.mov08));
        items.add(new Movie("헬보이",R.drawable.mov09));
        items.add(new Movie("백 투더 퓨처",R.drawable.mov10));
        items.add(new Movie("여인의 향기",R.drawable.mov11));
        items.add(new Movie("쥬라기 공원",R.drawable.mov12));
    }


    @Override
    public int getCount() { //최초에 화면의 갯수를 설정함
        Log.d(TAG, "getCount: ");
        return items.size();
    }

    @Override
    public Object getItem(int position) { //아이템이 클릭될 때 아이템의 데이터를 도출
        Log.d(TAG, "getItem: "+position);
        return items.get(position);
    }

    @Override
    public long getItemId(int position) { //필수 아님
        Log.d(TAG, "getItemId: "+position);
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.d(TAG, "getView: "+position);
        //레이아웃 인플레이터로 인플레이터 객체 접근
        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        //메모리에 아이템 하나 인플레이팅
        View itemView=inflater.inflate(R.layout.item,parent,false);
        //뷰 찾기
        TextView tv=itemView.findViewById(R.id.tv_title);
        ImageView imageView=itemView.findViewById(R.id.iv_img_resource);
        //뷰 교체
        String title=((Movie)getItem(position)).getTitle();
        int imgResource=((Movie)getItem(position)).getImgResource();
        tv.setText(title);
        imageView.setImageResource(imgResource);
        return itemView;
    }
}

 

 

지난 포스팅과 크게 다른점은

1. List 타입을 String이 아니라 오브젝트 형태로 받는다.

그러기 때문에 사용자 타입을 하나 더 만들어줘야 한다.

 

Movie.java

package com.mary.movieapp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder

public class Movie {
    private String title;
    private int imgResource;
}

이 때 하나 주의할 점은 리소스 파일에 들어있는 이미지 파일은 int 형태라는 점이다.

다음과 같이 리소스 파일에 들어간 파일은 안드로이드가 따로 아이디(int)를 부여하여 관리하기 때문이다.

 

(컨테이너로 데이터를 받은 것은 함수를 써서 데이터를 받지 않고 일반적으로 등록만 할 것이기 때문입니다..)

 

2. 이미지뷰를 새로 그리는 getView 함수에서 이미지와 이름, 두 가지를 동시에 바꾼다.

이 때, 받아오는 타입이 오브젝트이기 때문에 getter setter를 참조해서 값을 받아내려면 먼저 해당 타입으로 다운캐스팅 해주는 것도 잊지 말자.

 

그러면 간단하게 값을 바꿀 수 있다.

 

MainActivity .java

package com.mary.movieapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.opengl.EGLExt;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    private Context mContext=MainActivity.this;
    private ListView listView;
    private SingleAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter=new SingleAdapter();
        listView=findViewById(R.id.list_view);

        listView.setAdapter(adapter);

    }
}
반응형