RecyclerView

J·2022년 8월 31일
1

Android_Study

목록 보기
1/5

📌 RecyclerView

  • 목록 화면 구성을 위한 뷰
    - 앱에서 목록화면을 주로 RecyclerView로 제작
    • ex) 카톡 대화 목록 화면 등...
  • 사용자가 관리하는 많은 수의 데이터 집합(Data Set)을
    개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹(ViewGroup)

  • 스크롤 시 (가장 먼저) 처음 화면에 보이는 뷰 객체를 삭제하지 않고 기억하고 있다가, 뒤로 넘겨 재활용한다.


📍 ListView vs RecyclerView

ListView

  • 화면을 스크롤 할 때마다 위에 있던 뷰를 삭제하고, 맨 아래의 뷰를 생성된다.
  • 데이터의 아이템 만큼 뷰를 생성 (화면에 나오는 데이터 만큼 뷰 생성)
  • 이를 반복하여 목록 화면을 만들면 비용이 높아지고 비효율적이다.

RecyclerView

  • RecyclerView는 아이템이 아무리 많더라도 화면에 보이는 정도의 뷰(View)만 생성하고, 스크롤 할 때마다 뷰를 삭제하지 않고, 가장 아래의 아이템쪽으로 뷰 객체를 이동시켜 재사용하게 된다.



📍 RecyclerView 작성하기

1. 레이아웃 작성

recyclerviewitem.xml

  • 아이템 레이아웃 (데이터 하나하나가 어떻게 들어갈 것인지 틀을 우선 정해주어야 한다.)
  • 아이템 하나의 디자인(틀) 작성

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="0dp"
        android:layout_height="110dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:background="@drawable/asdf"
        tools:ignore="MissingConstraints">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txt1"
            android:text="@string/txt1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="15dp"
            android:layout_marginTop="15dp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txt2"
            android:text="@string/txt2"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt1"
            android:layout_marginStart="15dp"
            android:layout_marginTop="15dp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txt3"
            android:text="@string/txt3"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt2"
            app:layout_constraintBaseline_toBaselineOf="parent"
            android:layout_marginStart="15dp"
            android:layout_marginTop="10dp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txt4"
            android:text="@string/txt4"
            app:layout_constraintStart_toEndOf="@id/txt3"
            app:layout_constraintTop_toBottomOf="@id/txt2"
            app:layout_constraintBaseline_toBaselineOf="parent"
            android:layout_marginTop="10dp"
            android:layout_marginStart="10dp"
            />

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@android:color/holo_green_light"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txt2"
            app:layout_constraintBaseline_toBaselineOf="parent"
            android:layout_marginEnd="15dp"
            android:layout_marginTop="10dp"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

  • 메인 레이아웃에 recyclerview 추가
  • 화면에 아이템 항목들을 추가할 수 있도록, recyclerview 틀을 넣기

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
    
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        tools:listitem="@layout/recyclerviewitem"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>


2. 모델 생성

DataModel.java

  • RecyclerView 에 들어갈 데이터들을 정리
  • getter와 setter를 통해 데이터의 입출력이 이루어진다
  • Title, Contents, Time, Writer의 데이터 값
package com.example.myapplication;

public class DataModel {
    private String title;
    private String contents;
    private String time;
    private String writer;

    public DataModel(String title, String contents, String time, String writer) {
        this.title = title;
        this.contents = contents;
        this.time = time;
        this.writer = writer;
    }

    public String getTitle() {
    	return title;
    }
    public void setTitle(String title) {
    	this.title = title;
    }

    public String getContents() {
        return contents;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }

    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }

    public String getWriter() {
        return writer;
    }
    public void setWriter(String writer) {
        this.writer = writer;
    }
}

3. Adapter 작성 (자바)

RecyclerViewAdapter.java

  • 작성했던 아이템 레이아웃과 데이터를 실제로 연결하는 역할을 수행
package com.example.myapplication;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;

public class RecyclerViewAdapter extends RecyclerView.Adapter {

    String TAG = "RecyclerViewAdapter";

    ArrayList<DataModel> dataModels;
    Context context;

    public RecyclerViewAdapter(Context context, ArrayList<DataModel> dataModels){
        this.dataModels = dataModels;
        this.context = context;
    }

    public RecyclerViewAdapter(ArrayList<DataModel> dataModels) {
        this.dataModels = dataModels;
    }

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

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Log.d(TAG, "onCreateViewHolder");

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewitem, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder");
            Log.w(";;;;ppp", "dddd" + dataModels.size());
            ViewHolder viewHolder = (ViewHolder)holder;
        viewHolder.title.setText(dataModels.get(position).getTitle());
        viewHolder.contents.setText(dataModels.get(position).getContents());
        viewHolder.time.setText(dataModels.get(position).getTime());
        viewHolder.writer.setText(dataModels.get(position).getWriter());
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView title;
        private TextView contents;
        private TextView time;
        private TextView writer;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.txt1);
            contents = itemView.findViewById(R.id.txt2);
            time = itemView.findViewById(R.id.txt3);
            writer = itemView.findViewById(R.id.txt4);
        }
    }
}


4. 메인 엑티비티 (자바)

MainActivity.java

  • RecyclerView 에 Adapter 와 LayoutManager를 서로 연결
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.util.Log;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

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

        RecyclerViewAdapter adapter;
        RecyclerView recyclerView;

        ArrayList<DataModel> dataModels = new ArrayList();

        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("zzzz", "wwww", "1111", "oooo"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));
        dataModels.add(new DataModel("aaaa", "ssss", "0000", "qqqq"));

        Log.e("9999999","pp" + dataModels.size());

        recyclerView = findViewById(R.id.recyclerview);
        adapter = new RecyclerViewAdapter(this, dataModels);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
    }
}

📌 완성


작성한 전체 소스코드 github : Android_Study/RecyclerView/

profile
Hello World!

0개의 댓글