상세 컨텐츠

본문 제목

Android RecyclerView 구현하기!

안드로이드

by 삽질하는 개발자 2022. 1. 9. 21:58

본문

RecyclerView 란?

기존에 안드로이드에서 많이 사용하던 ListView의 확장판? 이라고 생각하시면 됩니다.

ListView와 리스트를 보여주는 것이 목적이지만, RecyclerView는 생선한 뷰 객체를 재사용합니다.

만약1000개의 리스트가 있으면 ListView는 1000개의 뷰 객체를 생성하지만, RecyclerView는 화면에 보이는만큼 뷰 객체를 생성하고 재사용합니다.

리스트가 몇 개 없으면 둘 다 상관없지만, 리스트 많을수록 RecyclerView를 사용하는 것이 좋습니다.

 

 

실습

1. 메인 레이아웃 파일에 RecyclerView 설정

먼저 레이아웃 파일에 RecyclerView를 추가해줍니다.

저는 MainActivity에 추가해볼게요!

res/layout/activity_main.xml

 

<?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/list_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.recyclerview.widget.RecyclerView>


</androidx.constraintlayout.widget.ConstraintLayout>

 

2. 아이템 레이아웃 설정

 

리스트에 표시될 아이템 레이아웃입니다.

어떻게 표현할지는 각자 맞게 작성하시면 됩니다.

 

res/layout/list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:id="@+id/item_board">

    <TextView
        android:id="@+id/item_board_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8sp"
        android:layout_marginLeft="8sp"
        android:textSize="24sp"
        android:textStyle="bold"

        android:text="TITLE" />

    <TextView
        android:id="@+id/item_board_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:layout_marginLeft="8sp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="Contents"
        android:textSize="16sp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8sp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/item_board_time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"

            android:textSize="16sp"
            android:text="Time" />

        <TextView
            android:id="@+id/item_board_writer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"

            android:textSize="16sp"
            android:text="Writer" />

        <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1" />

        
    </LinearLayout>

</LinearLayout>

2. 데이터를 정보를 담을 Class 생성

리스트 아이템에 들어갈 실제 데이터들을 관리하는 부분

 

Board.java

package com.example.myapplication;

public class Board {

    private String title;
    private String contents;
    private String time;
    private String writer;

    public Board(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 생성

위에서 작성했던 아이템 레이아웃(list_item.xml)과 데이터(Board.java)를 연결하는 역할

 

BoardAdapter.java

package com.example.myapplication;

import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

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

public class BoardAdapter extends RecyclerView.Adapter<BoardAdapter.BoardViewHolder>{

    //데이터 리스트
    private List<Board> dataList;

    public BoardAdapter(List<Board> dataList){
        this.dataList = dataList;
    }


    @NonNull
    @Override
    public BoardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //ViewHolder 객체 생성 후 리턴.
        //작성한 list_iem.xml 를 생성하는 부분이라고 생각하시면 됩니다.

       return new BoardViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false));

    }

    @Override
    public void onBindViewHolder(@NonNull BoardViewHolder holder, int position) {

        // ViewHolder 가 재활용 될 때 사용되는 메소드
        Board data = dataList.get(position);
        holder.title.setText(data.getTitle());
        holder.contents.setText(data.getContents());
        holder.time.setText(data.getTime());
        holder.writer.setText(data.getWriter());
    }

    @Override
    public int getItemCount() {

        // 전체 데이터의 개수 조회
        return dataList.size();
    }



    public class BoardViewHolder extends RecyclerView.ViewHolder {
        //ViewHolder 에 필요한 데이터들
        private TextView title;
        private TextView contents;
        private TextView time;
        private TextView writer;

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

            title = itemView.findViewById(R.id.item_board_title);
            contents = itemView.findViewById(R.id.item_board_content);
            time = itemView.findViewById(R.id.item_board_time);
            writer = itemView.findViewById(R.id.item_board_writer);


        }
    }
}

 

4. MainAcitivity의 RecyclerView에 Adapter연결

MainAcitivty의 RecyclerView에 연결해주면 끝.

 

MainActivity.java

 

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 android.view.View;

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

public class MainActivity extends AppCompatActivity {

    private RecyclerView mPostRecyclerView;

    private BoardAdapter mAdapter;
    private List<Board> mDatas;


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

        mPostRecyclerView =findViewById(R.id.list_rv);
        mDatas = new ArrayList<>();

        mDatas.add(new Board("title1","contents1","time1","winter1"));
        mDatas.add(new Board("title2","contents2","time2","winter2"));
        mDatas.add(new Board("title3","contents3","time3","winter3"));
        mDatas.add(new Board("title4","contents4","time4","winter4"));


        mAdapter = new BoardAdapter(mDatas);
        mPostRecyclerView.setAdapter(mAdapter);
        mPostRecyclerView.setLayoutManager(new LinearLayoutManager(this));


    }
}

 

결과

 

추가했던 4개의 리스트가 정상적으로 표시!!

관련글 더보기