코드 확인

https://github.com/jaybon1/androidwork/tree/master/instagramRecycleView

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

영화 포스터 앱

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: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="@android:color/darker_gray"/>

</RelativeLayout>

 

 

alt + insert

 

package com.jaybon.movie;

import android.media.Image;
import android.text.Layout;
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 org.w3c.dom.Text;

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));
    }

    // 모든건수 받기
    public void addItems(List<Movie> items){
        this.items = items;
    }

    // 한건씩 받기 생략
    
    // getCount과 getItem는 필수!

    @Override
    public int getCount() { // 데이터 사이즈, 최초에 화면을 몇건 만들 것인지
        Log.d(TAG, "getCount: ");
        return items.size();
    }

    @Override
    public Object getItem(int position) { // 아이템 가져오기
        Log.d(TAG, "getItem: ");
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        Log.d(TAG, "getItemId: ");
        return 0;
    }


    // 집중!
    // 메모리에 인플레이트해서 화면에 뿌려주는 것
    @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); //아이템뷰

        // View 찾기
        TextView tv = itemView.findViewById(R.id.tv_title); //뷰에서 텍스트뷰 찾기
        ImageView iv = itemView.findViewById(R.id.iv_img_resource); //뷰에서 이미지뷰 찾기

        String title = ((Movie) getItem(position)).getTitle();
        int imageResource = ((Movie) getItem(position)).getImgResource();

        tv.setText(title);
        iv.setImageResource(imageResource);

        return itemView;
    }
}

 

 

--------------------------

어댑터에 5건이 있다면

리스트뷰 - 화면을 이동할 때마다 인플레이터가 계속 많이 실행된다 (뷰가 계속 생성됨) - 세로만가능

리사이클러뷰 - 만들어진 틀에다가 데이터만 교체(뷰는 유지 데이터변경), 뷰홀더 패턴 - 가로세로가능

 

--------------------------

 

리사이클러 뷰

 

https://codinginflow.com/

 

Tutorials - Coding in Flow

⭐ Newest Tutorials 🔠 Language Tutorials Kotlin Android Tutorials 🏛️ Architecture & Best Practices Room + ViewModel + LiveData + RecyclerView (MVVM) Dagger 2 View Binding Data Binding Testing 📏 ... Read more

codinginflow.com

 

 

 

다운로드

 

 

MovieAdapter

 

 

package com.jaybon.recyclerviewmovieex01;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MyViewHolder> {

    private static final String TAG = "MovieAdapter";
    
    // 어댑터는 컬렉션을 들고 있어야한다
    private List<Movie> items = new ArrayList<>();


    // 리스트뷰의 getView와 비슷하다
    // 껍데기만! 만들어줌! 1번으로 실행됨
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.item,parent,false);
        return new MyViewHolder(view);
    }

    // 껍데기에 데이터 바인딩 해줌. 2번으로 실행됨
    // holder는 뷰홀더의 주소를 가지고 있다
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        // 아이템의 포지션값을 이용해서 데이터를 가져옴
        Movie movie = items.get(position);
        // 홀더에 아이템넣기
        holder.setItem(movie);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    // ViewHolder (뷰들의 책꽂이)
    public static class MyViewHolder extends RecyclerView.ViewHolder { // 뷰홀더

        // 규칙1 (xml이 들고있는 뷰)
        private TextView tvTitle;
        private ImageView ivImgResource;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tv_title);
            ivImgResource = itemView.findViewById(R.id.iv_img_resource);
        }

        // 규칙3
        public void setItem(Movie movie){
            tvTitle.setText(movie.getTitle());
            ivImgResource.setImageResource(movie.getImgResource());
        }

    }

}

 

MainActivity

package com.jaybon.recyclerviewmovieex01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Main_Activity";
    private RecyclerView rvMovie;

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

        rvMovie = findViewById(R.id.rv_movie);
        MovieAdapter adapter = new MovieAdapter();

        // 외부에서 데이터 받을때 쓰레드로 받아주면 됨
        adapter.addItem(new Movie("써니",R.drawable.mov01));
        adapter.addItem(new Movie("완득이",R.drawable.mov02));
        adapter.addItem(new Movie("괴물",R.drawable.mov03));
        adapter.addItem(new Movie("라디오스타",R.drawable.mov04));
        adapter.addItem(new Movie("비열한거리",R.drawable.mov05));
        adapter.addItem(new Movie("왕의남자",R.drawable.mov06));
        adapter.addItem(new Movie("아일랜드",R.drawable.mov07));
        adapter.addItem(new Movie("웰컴투동막골",R.drawable.mov08));
        adapter.addItem(new Movie("헬보이",R.drawable.mov09));
        adapter.addItem(new Movie("백투더퓨처",R.drawable.mov10));
        adapter.addItem(new Movie("여인의향기",R.drawable.mov11));
        adapter.addItem(new Movie("쥬라기공원",R.drawable.mov12));

        // 레이아웃매니저 설정(버티컬인지 호라이즌인지)
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        rvMovie.setLayoutManager(layoutManager);
        rvMovie.setAdapter(adapter);
    }
}

 

 

----------------

---------------

 

인스타그램 UI에 리사이클러 뷰 넣기

 

 

 

 

 

리사이클러 뷰 아이템은 merge를 사용하지말것

 

https://github.com/jaybon1/androidwork/tree/master/instagramRecycleView

 

jaybon1/androidwork

Contribute to jaybon1/androidwork development by creating an account on GitHub.

github.com

 

 

--------------

 

 

 

 

+ Recent posts