본문 바로가기

안드로이드

<Android Studio -JAVA> RecyclerView 사용하기

728x90

RecyclerView

는 ListView의 개선판이다. 목록의 뷰는 ViewHolder 로 표현되며 각 ViewHolder 는 View를 사용하여 각 항목을 표시하는 역할을 한다.
ViewHolder 객체는 Adapter 에서 관리하며 Adapter 는 필요에 따라 ViewHolder 를 만들어 onBindViewHolder()를 호출함으로써 데이터에 바인딩한다.
View를 채울 때 LayoutManger 가 필요한데, LinearLayoutManager 또는 GridLayoutManager 를 쓰거나 직접 구현하여 사용하면 된다.

 

1. build.gradle 추가 

dependencies {
  implementation "androidx.recyclerview:recyclerview:1.1.0"    
}

 

2.Main_layout에 RecyclerView 추가 . 

       <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/rv_obbligato_post"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scrollbarFadeDuration="0"   // 스크롤바 자동 없어짐 설정
                    android:scrollbarSize="5dp"   // 스크롤바 사이즈
                    android:scrollbarThumbVertical="@android:color/darker_gray"// 스크롤바 색상설정
                    android:scrollbars="vertical"
                />

 

3.item_layout 만들기 .

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="wrap_content">  /// wrap으로 설정해줘야됨

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:padding="20dp">

        <ImageView
            android:id="@+id/profile"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:src="@drawable/ic_launcher_foreground"/>

      
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="이름"
            android:textSize="16sp"
            android:textColor="#000"/>

        <--상태 메시지-->
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="100dp"
            android:text="상태메시지"
            android:textSize="12sp"
            android:textColor="#444"
            android:maxLines="1"/>

    </LinearLayout>



</LinearLayout>

 

4.Data 클래스 만들기 

item_layout에 들어갈 데이터들을 넣어주기 위한 클래스 

들어갈 데이터를 생성한다음 키보드 alt,Insert 키를 눌러서 getter ,setter , constructor 만들기 

 

public class Data {

//item_layout에 들어갈 데이터 

    String name;     //item에 넣어질 이름 
    String message;    //item에 넣어질 메세지  
    int resourceId;        //item에 넣어질 사진
    
    ///getter setter 만들기 
    public int getResourceId() {
        return resourceId;
    }

    public String getMessage() {
        return message;
    }

    public String getName() {
        return name;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setResourceId(int resourceId) {
        this.resourceId = resourceId;
    }

//constructor 만들기 
   public Data(int resourceId,String name, String message ) {
        this.name = name;
        this.message = message;
        this.resourceId = resourceId;
    }
}

 

5.Adapter 만들기 

Adapter  RecyclerView.Adapter를 상속받아 구현하고, ViewHolder  RecyclerView.ViewHolder를 상속받아 구현한다.

1. 처음 


public class Adapter  extends RecyclerView.Adapter<Adapter.AdapterViewholder> {

}

그러면 빨간줄이 생성이 된다. 당황하지 말고 alt , enter 를 눌러주고 create class 를 해준다 . 그러면 또 빨간줄이 생길것이다. 당황하지 말고 빨간줄을 클릭하고 alt , enter를 눌러서 계속 import를 해주자 . 

 

 

2.완성

    public class Adapter  extends RecyclerView.Adapter<Adapter.AdapterViewholder> {
        @NonNull
        @Override
        public AdapterViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return null;
        }

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

        }

        @Override
        public int getItemCount() {
            return 0;
        }

        public class AdapterViewholder extends RecyclerView.ViewHolder {
            public AdapterViewholder(@NonNull View itemView) {
                super(itemView);
            }
        }
    }

50% 왔다. 

 

6. item_layout과 Adapter 연결 

package com.example.recyclerview_posting;

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;


public class Adapter  extends RecyclerView.Adapter<Adapter.AdapterViewholder> {

    private ArrayList<Data> Data_arrayList;   ///아까 만들어두었던 Data 클래스를 어레이리스트로 만든다.


    public Adapter(ArrayList<Data> arrayList) { //Main_class와 연동하기 위한 adapter 파라미터
        this.Data_arrayList = arrayList;
    }

    @NonNull
    @Override    ///onCreateViewHolder에서는 어떤 레이아웃과 연결해야되는지 설정하고 view를 만들어준다.
    public AdapterViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
        AdapterViewholder holder = new AdapterViewholder(view);
        return holder;
    }

    @Override //받아온 데이터를 item_layout에  set해주는 곳
    public void onBindViewHolder(@NonNull AdapterViewholder holder, int position) {
        holder.profile.setImageResource(Data_arrayList.get(position).getResourceId());
        holder.name.setText(Data_arrayList.get(position).getName());
        holder.message.setText(Data_arrayList.get(position).getMessage());


    }

    @Override
    //아이템 카운트
    public int getItemCount() {
        return (null != Data_arrayList ? Data_arrayList.size() :0);
    }


    /// item_layout의 데이터 초기화해주는 클래스
    public class AdapterViewholder extends RecyclerView.ViewHolder {
        ImageView profile;
        TextView name ,message;

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

            profile = (ImageView) itemView.findViewById(R.id.profile);
            name = (TextView) itemView.findViewById(R.id.name);
            message = (TextView) itemView.findViewById(R.id.message);
        }
    }
    }

 

7.MainActivity와 Adapter 연결 

public class MainActivity extends AppCompatActivity {

    private ArrayList<Data> Main_dataList;   /// 데이터를 담기위한 어레이 리스트
    private Adapter Main_adapter; //어댑터
    private RecyclerView recyclerview;
    private LinearLayoutManager linearLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);  /// 리사이클러뷰 초기화 
        recyclerview.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL)); ///구분선 넣어주는 옵션 
        linearLayoutManager = new LinearLayoutManager(this); // 레이아웃 매니져
        recyclerview.setLayoutManager(linearLayoutManager); // 리사이클러뷰에 set 해준다 . 
        Main_dataList = new ArrayList<>(); // 어댑터 선언 
        Main_adapter = new Adapter(Main_dataList); // 어댑터에 어레이리스트 넣어준다. 
        recyclerview.setAdapter(Main_adapter);// 리사이클러뷰에 어댑터 set 해준다.  

    }
}

8. 데이터 넣어주기 

여기서는 자신이 원하는 데이터를 넣어주면된다. 

저는 그냥 for문을 돌려주었습니다 ;; 

package com.example.recyclerview_posting;

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

import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private ArrayList<Data> Main_dataList;   /// 데이터를 담기위한 어레이 리스트
    private Adapter Main_adapter; //어댑터
    private RecyclerView recyclerview;
    private LinearLayoutManager linearLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);  /// 리사이클러뷰 초기화
        recyclerview.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL)); ///구분선 넣어주는 옵션
        linearLayoutManager = new LinearLayoutManager(this); // 레이아웃 매니져
        recyclerview.setLayoutManager(linearLayoutManager); // 리사이클러뷰에 set 해준다 .
        Main_dataList = new ArrayList<>(); // 어댑터 선언
        Main_adapter = new Adapter(Main_dataList); // 어댑터에 어레이리스트 넣어준다.
        recyclerview.setAdapter(Main_adapter);// 리사이클러뷰에 어댑터 set 해준다.



        load();



    }

    void load(){
        for (int i =0; i<10; i++) {
            Data data = new Data(R.mipmap.ic_launcher_round, i + "번째 사람", i + "번째 상태메시지");
            Main_dataList.add(0, data);
            Main_adapter.notifyDataSetChanged();
        }
    }

}

 

 

리사이클러뷰 완성 ~ 

 

 

 

처음엔 어렵지만 익숙해지면 너무 편리한 recyclerview 였습니다. 

 

 

참조: https://4z7l.github.io/2020/09/12/recyclerview.html