[국비학원 기록/Android] 어댑터뷰 종류, 영화 포스터 app 만들기
my code archive
article thumbnail
반응형

1. 어댑터 뷰 종류

  • 1)리스트뷰(ListView)
  • 2)갤러리(Gallery)
  • 3)스피너(Spinner)
  • 4)그리드뷰(GridView)

 

2. 어댑터 뷰(AdapterView)

  • 1)배열이나 파일,데이터베이스에 저장된 데이터를 화면에 표시할 때 유용한 뷰
  • 2)어댑터 뷰를 사용할 때 어댑터 뷰의 모양을 설정하고 데이터를 채워주는 ArrayAdapter<T>

3. 리스트 뷰

  • 1)항목들을 수직으로 보여주는 어댑터 뷰
  • 2)상하로 스크롤 가능

4. 리스트 뷰의 표준 레이어아웃

  • simple_list_item_1 : 하나의 텍스트 뷰 사용

5. 그리드뷰(GridView)

  • 사진이나 그림을 격자 모양으로 배치
  • <GridView>의 속성 중 열 개수 지정하는 것 - numColumns는 꼭 넣어야 함.

6. 갤러리(Gallery)

  • 1)사진이나 이미지를 배치하고 좌우로 스크롤해서 볼 수 있도록 해줌.
  • 2)이미지 목록을 스크롤하는 기능만 존재
  • 3)좀더 부드럽고 고급스러운 느낌을 줌

🤍안드로이드 어댑터 뷰 사용하여 영화 포스터 app 만들기

 

영화 포스터.zip
2.55MB

 

  • 리스트 뷰(ListView)
package kr.co.moviecustomlistview;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {
    ListView listView;

    String[] titles = { "토이스토리1", "호빗2", "제이슨 본3", "반지의 왕4", "정직한 후보5",
            "토이스토리6", "호빗7", "제이슨 본8", "반지의 왕9", "정직한 후보10",
            "토이스토리11", "호빗12", "제이슨 본13", "반지의 왕14", "정직한 후보15",
            "토이스토리16", "호빗17", "제이슨 본18", "반지의 왕19", "정직한 후보20",
            "토이스토리21", "호빗22", "제이슨 본23", "반지의 왕24", "정직한 후보25",
            "토이스토리26", "호빗27", "제이슨 본28", "반지의 왕29", "정직한 후보30",
            "토이스토리31", "호빗32", "제이슨 본33", "반지의 왕34", "정직한 후보35",
            "토이스토리36", "호빗37", "제이슨 본38", "반지의 왕39", "정직한 후보40",
            "토이스토리41", "호빗42", "제이슨 본43", "반지의 왕44", "정직한 후보45",
            "토이스토리46", "호빗47", "제이슨 본48", "반지의 왕49", "정직한 후보50",
            "토이스토리51", "호빗52", "제이슨 본53", "반지의 왕54", "정직한 후보55",
            "토이스토리56", "호빗57", "제이슨 본58", "반지의 왕59", "정직한 후보60",
            "토이스토리61", "호빗62", "제이슨 본63", "반지의 왕64", "정직한 후보65",
            "토이스토리66", "호빗67", "제이슨 본68", "반지의 왕69", "정직한 후보70",
            "토이스토리71", "호빗72", "제이슨 본73", "반지의 왕74", "정직한 후보75",
            "토이스토리76", "호빗77", "제이슨 본78", "반지의 왕79", "정직한 후보80",
            "토이스토리81", "호빗82", "제이슨 본83"};

    Integer[] images = {
            R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04,  R.drawable.mov05,
            R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09,  R.drawable.mov10,
            R.drawable.mov11, R.drawable.mov12, R.drawable.mov13, R.drawable.mov14,  R.drawable.mov15,
            R.drawable.mov16, R.drawable.mov17, R.drawable.mov18, R.drawable.mov19,  R.drawable.mov20,
            R.drawable.mov21, R.drawable.mov22, R.drawable.mov23, R.drawable.mov24,  R.drawable.mov25,
            R.drawable.mov26, R.drawable.mov27, R.drawable.mov28, R.drawable.mov29,  R.drawable.mov30,
            R.drawable.mov31, R.drawable.mov32, R.drawable.mov33, R.drawable.mov34,  R.drawable.mov35,
            R.drawable.mov36, R.drawable.mov37, R.drawable.mov38, R.drawable.mov39,  R.drawable.mov40,
            R.drawable.mov41, R.drawable.mov42, R.drawable.mov43, R.drawable.mov44,  R.drawable.mov45,
            R.drawable.mov46, R.drawable.mov47, R.drawable.mov48, R.drawable.mov49,  R.drawable.mov50,
            R.drawable.mov51, R.drawable.mov52, R.drawable.mov53, R.drawable.mov54,  R.drawable.mov55,
            R.drawable.mov56, R.drawable.mov57, R.drawable.mov58, R.drawable.mov59,  R.drawable.mov60,
            R.drawable.mov61, R.drawable.mov62, R.drawable.mov63, R.drawable.mov64,  R.drawable.mov65,
            R.drawable.mov66, R.drawable.mov67, R.drawable.mov68, R.drawable.mov69,  R.drawable.mov70,
            R.drawable.mov71, R.drawable.mov72, R.drawable.mov73, R.drawable.mov74,  R.drawable.mov75,
            R.drawable.mov76, R.drawable.mov77, R.drawable.mov78, R.drawable.mov79,  R.drawable.mov80,
            R.drawable.mov81, R.drawable.mov82, R.drawable.mov83 };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);

        CustomList adapter = new CustomList(MainActivity.this);

        listView = findViewById(R.id.list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getApplicationContext(),titles[i], Toast.LENGTH_SHORT).show();
            }
        });

    }

    //내부 클래스 정의
    private class CustomList extends ArrayAdapter<String> {
        private final Activity context;
        public CustomList(Activity context) {
            super(context, R.layout.listitem, titles);
            this.context = context;
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

            LayoutInflater inflater = context.getLayoutInflater();
            View rowView = inflater.inflate(R.layout.listitem, null, true);

            ImageView imageView = rowView.findViewById(R.id.image);
            TextView title = rowView.findViewById(R.id.title);
            TextView rating = rowView.findViewById(R.id.rating);
            TextView genre = rowView.findViewById(R.id.genre);
            TextView year = rowView.findViewById(R.id.releaseYear);

            title.setText(titles[position]);
            imageView.setImageResource(images[position]);
            rating.setText("9.0"+position);
            genre.setText("DRAMA");
            year.setText(1950+position+"");
            return rowView;

        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/list">
    </ListView>

</RelativeLayout>

 

  • 갤러리(Gallery)
package kr.co.galleryapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);
        setTitle("갤러리 영화(업그레이드)");

        Gallery gallery = findViewById(R.id.gallery);

        MyGalleryAdapter galleryAdapter = new MyGalleryAdapter(this);
        gallery.setAdapter(galleryAdapter);

    }

    private class MyGalleryAdapter extends BaseAdapter {
        Context context;
        Integer[] posterID = {
                R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04,  R.drawable.mov05,
                R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09,  R.drawable.mov10,
                R.drawable.mov11, R.drawable.mov12, R.drawable.mov13, R.drawable.mov14,  R.drawable.mov15,
                R.drawable.mov16, R.drawable.mov17, R.drawable.mov18, R.drawable.mov19,  R.drawable.mov20,
                R.drawable.mov21, R.drawable.mov22, R.drawable.mov23, R.drawable.mov24,  R.drawable.mov25,
                R.drawable.mov26, R.drawable.mov27, R.drawable.mov28, R.drawable.mov29,  R.drawable.mov30,
                R.drawable.mov31, R.drawable.mov32, R.drawable.mov33, R.drawable.mov34,  R.drawable.mov35,
                R.drawable.mov36, R.drawable.mov37, R.drawable.mov38, R.drawable.mov39,  R.drawable.mov40,
                R.drawable.mov41, R.drawable.mov42, R.drawable.mov43, R.drawable.mov44,  R.drawable.mov45,
                R.drawable.mov46, R.drawable.mov47, R.drawable.mov48, R.drawable.mov49,  R.drawable.mov50,
                R.drawable.mov51, R.drawable.mov52, R.drawable.mov53, R.drawable.mov54,  R.drawable.mov55,
                R.drawable.mov56, R.drawable.mov57, R.drawable.mov58, R.drawable.mov59,  R.drawable.mov60,
                R.drawable.mov61, R.drawable.mov62, R.drawable.mov63, R.drawable.mov64,  R.drawable.mov65,
                R.drawable.mov66, R.drawable.mov67, R.drawable.mov68, R.drawable.mov69,  R.drawable.mov70,
                R.drawable.mov71, R.drawable.mov72, R.drawable.mov73, R.drawable.mov74,  R.drawable.mov75,
                R.drawable.mov76, R.drawable.mov77, R.drawable.mov78, R.drawable.mov79,  R.drawable.mov80,
                R.drawable.mov81, R.drawable.mov82, R.drawable.mov83 };

        String[] posterTitle = { "토이스토리1", "호빗2", "제이슨 본3", "반지의 왕4", "정직한 후보5",
                "토이스토리6", "호빗7", "제이슨 본8", "반지의 왕9", "정직한 후보10",
                "토이스토리11", "호빗12", "제이슨 본13", "반지의 왕14", "정직한 후보15",
                "토이스토리16", "호빗17", "제이슨 본18", "반지의 왕19", "정직한 후보20",
                "토이스토리21", "호빗22", "제이슨 본23", "반지의 왕24", "정직한 후보25",
                "토이스토리26", "호빗27", "제이슨 본28", "반지의 왕29", "정직한 후보30",
                "토이스토리31", "호빗32", "제이슨 본33", "반지의 왕34", "정직한 후보35",
                "토이스토리36", "호빗37", "제이슨 본38", "반지의 왕39", "정직한 후보40",
                "토이스토리41", "호빗42", "제이슨 본43", "반지의 왕44", "정직한 후보45",
                "토이스토리46", "호빗47", "제이슨 본48", "반지의 왕49", "정직한 후보50",
                "토이스토리51", "호빗52", "제이슨 본53", "반지의 왕54", "정직한 후보55",
                "토이스토리56", "호빗57", "제이슨 본58", "반지의 왕59", "정직한 후보60",
                "토이스토리61", "호빗62", "제이슨 본63", "반지의 왕64", "정직한 후보65",
                "토이스토리66", "호빗67", "제이슨 본68", "반지의 왕69", "정직한 후보70",
                "토이스토리71", "호빗72", "제이슨 본73", "반지의 왕74", "정직한 후보75",
                "토이스토리76", "호빗77", "제이슨 본78", "반지의 왕79", "정직한 후보80",
                "토이스토리81", "호빗82", "제이슨 본83"};

        public MyGalleryAdapter(Context context) {
            this.context = context;
        }

        @Override
        public int getCount() {
            return posterID.length;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            ImageView imageView = new ImageView(context);
            imageView.setLayoutParams(new Gallery.LayoutParams(200,300));
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            imageView.setPadding(5,5,5,5);
            imageView.setImageResource(posterID[i]);

            final int pos = i;
            imageView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    ImageView ivPoster = findViewById(R.id.ivPoster);
                    ivPoster.setScaleType(ImageView.ScaleType.FIT_CENTER);
                    ivPoster.setImageResource(posterID[pos]);

                    Toast toast = new Toast(getApplicationContext());
                    View toastView = View.inflate(getApplicationContext(), R.layout.toast, null);
                    TextView toastText = toastView.findViewById(R.id.textView);
                    toastText.setText(posterTitle[pos]);

                    toast.setView(toastView);
                    toast.show();

                    return false;
                }
            });




            return imageView;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Gallery
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/gallery"
        android:spacing="5dp"/>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ivPoster"
        android:padding="20dp"/>




</LinearLayout>

 

  • 그리드 뷰(GridView)
package kr.co.mygridview;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

/*
    영화 포스터를 클릭하면 나오는 대화상자의 제목 창에 영화 제목이 보이도록 수정하시오.
 */

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);
        setTitle("그리드뷰 영화 포스터");

        final GridView gridView = findViewById(R.id.gridview);

        MyGridAdapter gridAdapter = new MyGridAdapter(this);
        gridView.setAdapter(gridAdapter);
    }


    private class MyGridAdapter extends BaseAdapter {
        Context context;

        public MyGridAdapter(Context context) {
            this.context = context;
        }

        //영화 포스터 그림 파일의 ID를 배열 지정
        Integer[] posterID = {
                R.drawable.mov01, R.drawable.mov02, R.drawable.mov03, R.drawable.mov04,  R.drawable.mov05,
                R.drawable.mov06, R.drawable.mov07, R.drawable.mov08, R.drawable.mov09,  R.drawable.mov10,
                R.drawable.mov11, R.drawable.mov12, R.drawable.mov13, R.drawable.mov14,  R.drawable.mov15,
                R.drawable.mov16, R.drawable.mov17, R.drawable.mov18, R.drawable.mov19,  R.drawable.mov20,
                R.drawable.mov21, R.drawable.mov22, R.drawable.mov23, R.drawable.mov24,  R.drawable.mov25,
                R.drawable.mov26, R.drawable.mov27, R.drawable.mov28, R.drawable.mov29,  R.drawable.mov30,
                R.drawable.mov31, R.drawable.mov32, R.drawable.mov33, R.drawable.mov34,  R.drawable.mov35,
                R.drawable.mov36, R.drawable.mov37, R.drawable.mov38, R.drawable.mov39,  R.drawable.mov40,
                R.drawable.mov41, R.drawable.mov42, R.drawable.mov43, R.drawable.mov44,  R.drawable.mov45,
                R.drawable.mov46, R.drawable.mov47, R.drawable.mov48, R.drawable.mov49,  R.drawable.mov50,
                R.drawable.mov51, R.drawable.mov52, R.drawable.mov53, R.drawable.mov54,  R.drawable.mov55,
                R.drawable.mov56, R.drawable.mov57, R.drawable.mov58, R.drawable.mov59,  R.drawable.mov60,
                R.drawable.mov61, R.drawable.mov62, R.drawable.mov63, R.drawable.mov64,  R.drawable.mov65,
                R.drawable.mov66, R.drawable.mov67, R.drawable.mov68, R.drawable.mov69,  R.drawable.mov70,
                R.drawable.mov71, R.drawable.mov72, R.drawable.mov73, R.drawable.mov74,  R.drawable.mov75,
                R.drawable.mov76, R.drawable.mov77, R.drawable.mov78, R.drawable.mov79,  R.drawable.mov80,
                R.drawable.mov81, R.drawable.mov82, R.drawable.mov83 };

        String[] posterTitle = { "토이스토리1", "호빗2", "제이슨 본3", "반지의 왕4", "정직한 후보5",
                "토이스토리6", "호빗7", "제이슨 본8", "반지의 왕9", "정직한 후보10",
                "토이스토리11", "호빗12", "제이슨 본13", "반지의 왕14", "정직한 후보15",
                "토이스토리16", "호빗17", "제이슨 본18", "반지의 왕19", "정직한 후보20",
                "토이스토리21", "호빗22", "제이슨 본23", "반지의 왕24", "정직한 후보25",
                "토이스토리26", "호빗27", "제이슨 본28", "반지의 왕29", "정직한 후보30",
                "토이스토리31", "호빗32", "제이슨 본33", "반지의 왕34", "정직한 후보35",
                "토이스토리36", "호빗37", "제이슨 본38", "반지의 왕39", "정직한 후보40",
                "토이스토리41", "호빗42", "제이슨 본43", "반지의 왕44", "정직한 후보45",
                "토이스토리46", "호빗47", "제이슨 본48", "반지의 왕49", "정직한 후보50",
                "토이스토리51", "호빗52", "제이슨 본53", "반지의 왕54", "정직한 후보55",
                "토이스토리56", "호빗57", "제이슨 본58", "반지의 왕59", "정직한 후보60",
                "토이스토리61", "호빗62", "제이슨 본63", "반지의 왕64", "정직한 후보65",
                "토이스토리66", "호빗67", "제이슨 본68", "반지의 왕69", "정직한 후보70",
                "토이스토리71", "호빗72", "제이슨 본73", "반지의 왕74", "정직한 후보75",
                "토이스토리76", "호빗77", "제이슨 본78", "반지의 왕79", "정직한 후보80",
                "토이스토리81", "호빗82", "제이슨 본83"};

        // 그리드뷰에 보여질 이미지 개수 반환
        @Override
        public int getCount() {
            return posterID.length;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        // 영화 포스터를 각 그리드뷰의 칸마다 이미지뷰를 생성해서 보여주게 함.
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ImageView imageView = new ImageView(context);
            imageView.setLayoutParams(new GridView.LayoutParams(200,300));
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            imageView.setPadding(5,5,5,5);

            imageView.setImageResource(posterID[i]);

            final int pos = i;
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    View dialogView = View.inflate(MainActivity.this, R.layout.dialog, null);
                    AlertDialog.Builder dig = new AlertDialog.Builder(MainActivity.this);

                    ImageView ivPoster = dialogView.findViewById(R.id.ivPoster);
                    ivPoster.setImageResource(posterID[pos]);

                    dig.setTitle(posterTitle[i]);
                    dig.setIcon(R.drawable.ic_launcher);
                    dig.setView(dialogView);
                    dig.setNegativeButton("닫기", null);
                    dig.show();
                }
            });

            return imageView;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <GridView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/gridview"
        android:gravity="center"
        android:numColumns="4">
    </GridView>

</LinearLayout>

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형