본문 바로가기
Adroid Studio

Android Studio_안드로이드 스튜디오_간단한 리스트 만들기2(RecyclerView)

by 디디찐 2022. 8. 26.
반응형

■RecyclerView사용법

리사이클러뷰는 대량의 데이터의 집합을 효율적으로 화면에 나타내기 위해서, 각 아이템을 목록형태로

화면에 보여주는 위젯이다.

 

  •  Layout Manager- Item 뷰가 나열되는 형태(수평, 수작, 그리드)를 관리하기 위한 요소를 제공한다.
  •  Item - 화면에 표시할 실질적인 item리스트 (데이터)
  •  Adapter - Item(데이터)을 View와 연결해서 뷰(View) 생성 및 관리하는 객체
  • ViewHolder - 화면에 표시될 Item 뷰를 생성 또는 재활용하는 객체

Adapter 를 통해 만들어진 각 Item  ViewHolder 에 저장되어 화면에 표시되고, 필요에 따라 생성 또는 재활용 !!!!

즉, 스크롤을 내릴 때 이미 만들어진 ViewHolder가 존재한다면 Item만 바인딩시켜서 사용된다. 

=>ViewHolder의 Recycle(재활용)

 

✅작성 순서

1.  [activity_main.xml]  XML 파일에  RecyclerView를 작성한다.
2. itemView 레이아웃 구성을 위해  XML 생성한다.
3. itemView 에 표시될 데이터를 저장할 Class 생성한다
4. Adapter Class를 만든다.
5. LayoutManager와 Adapter 객체를 RecyclerView에 연결한다


■RecyclerView사용예제 (feat. 홍드로이드)

실행결과

 

 

1.  [activity_main.xml]  XML 파일에  RecyclerView를 작성한다.

RecyclerView가표시될 위치를 결정하기 위해 메인액티비티에 표시한다. 

 

- activity_main.xml

<?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="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin = "10dp"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id = "@+id/rv"
        android:layout_width ="match_parent"
        android:layout_height = "match_parent"
        android:scrollbarSize = "5dp"
        android:scrollbarFadeDuration ="0"
        android:scrollbarThumbVertical="@android:color/darker_gray"
        android:scrollbars = "vertical"
        android:layout_weight = "1"
        ></androidx.recyclerview.widget.RecyclerView>
    <Button
        android:id = "@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height = "wrap_content"
        android:text = "항목추가"
        ></Button>


</LinearLayout>

 

 

2. itemView 레이아웃 구성을 위해  XML 생성한다.

RecyclerView에 표시될 각 Item뷰가 어떻게 표시될지 레이아웃 작성

[res] -[layout]에  [item.xml] 생성

 

- item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="vertical"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <ImageView
            android:id="@+id/profile"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:src ="@mipmap/ic_launcher"
            ></ImageView>
        <LinearLayout
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:gravity ="center_vertical"
            android:orientation ="vertical"
            >
            <TextView
                android:id ="@+id/tv_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text ="안드로이드"
                ></TextView>
            <TextView
                android:id ="@+id/tv_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text ="리사이클러뷰"
                ></TextView>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

 

3. itemView 에 표시될 데이터를 저장할  Class  생성

[java] -  [MainData.java] 생성

Alt + Insert 하여  Constructor 와 Getter and Setter 추가

package com.androidpark.recycelrView;

public class MainData {
    private int iv_profile;
    private String tv_name,tv_content;


    //alt + insert 키  -> constructor
    public MainData(int iv_profile, String tv_name, String tv_content) {
        this.iv_profile = iv_profile;
        this.tv_name = tv_name;
        this.tv_content = tv_content;
    }
    //alt + insert 키  -> getter and setter
    public int getIv_profile() {
        return iv_profile;
    }

    public void setIv_profile(int iv_profile) {
        this.iv_profile = iv_profile;
    }

    public String getTv_name() {
        return tv_name;
    }

    public void setTv_name(String tv_name) {
        this.tv_name = tv_name;
    }

    public String getTv_content() {
        return tv_content;
    }

    public void setTv_content(String tv_content) {
        this.tv_content = tv_content;
    }
}

 

 

4. Adapter Class를 만든다.

RecyclerView.Adapter를 상속받는 새로운 Adapter 를 생성한다.

이때 오버라이드가 필요한 메서드는 아래의 3가지가 있다.

  • onCreateViewHolder(ViewGroup parent, int viewType)
  • onBindViewHolder(ViewHolder holder, int position)
  • getItemCount()

[java] -  [MainAdapter.java]  생성

 

-MainAdaoter.java

package com.androidpark.recycelrView;

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

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

import java.util.ArrayList;
import java.util.Queue;

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.CustomViewHolder> {

    //Item들을 담을 배열 list 생성
    private ArrayList<MainData> arrayList;

    public MainAdapter(ArrayList<MainData> arrayList) {
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    // viewType 형태의 아이템 뷰를 위한 뷰홀더 객체 생성 =>화면 출력 최초에 생성될 때 생명주기를 의미
    public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
        CustomViewHolder holder = new CustomViewHolder(view);
        return holder;
    }

    @Override
    //position(위치)에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
    public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
        holder.iv_profile.setImageResource(arrayList.get(position).getIv_profile());
        holder.tv_name.setText(arrayList.get(position).getTv_name());
        holder.tv_content.setText(arrayList.get(position).getTv_content());

        holder.itemView.setTag(position);
        //viewHolder 클릭 시 이벤트 구현
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String curName = holder.tv_name.getText().toString();
                Toast.makeText(view.getContext(), "curName", Toast.LENGTH_SHORT).show();
            }
        });
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                remove(holder.getAdapterPosition());
                return true;
            }
        });
    }

    @Override
    //전체 아이템 갯수 리턴
    public int getItemCount() {
        return (null != arrayList ? arrayList.size() : 0);
    }

    public void remove(int position) {
        try {
            arrayList.remove(position);
            notifyItemRemoved(position);
        } catch (IndexOutOfBoundsException ex) {
            ex.printStackTrace();
        }
    }

    public class CustomViewHolder extends RecyclerView.ViewHolder {

        //
        protected ImageView iv_profile;
        protected TextView tv_name;
        protected TextView tv_content;

        public CustomViewHolder(@NonNull View itemView) {
            super(itemView);
            this.iv_profile = (ImageView) itemView.findViewById(R.id.profile);
            this.tv_name = (TextView) itemView.findViewById(R.id.tv_name);
            this.tv_content = (TextView) itemView.findViewById(R.id.tv_content);

        }
    }

}

 

 

 

5. LayoutManager와 Adapter 객체를 RecyclerView에 연결

 

- MainActivity.java

package com.androidpark.recyclerview;

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

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private ArrayList<MainData> arrayList;
    private MainAdapter mainAdapter;
    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.rv);

        //LayoutManager를 RecyclerView에 연결
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);

        //Adapter 객체를 RecyclerView에 연결
        arrayList = new ArrayList<>();
        mainAdapter = new MainAdapter(arrayList);
        recyclerView.setAdapter(mainAdapter);

        Button btnAdd = (Button) findViewById(R.id.btnAdd);

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainData mainData = new MainData(R.mipmap.ic_launcher,"안드로이드","리사이클러뷰");
                arrayList.add(mainData);
                mainAdapter.notifyDataSetChanged();

            }
        });
    }
}

 

참고: https://www.youtube.com/watch?v=kNq9w1_nhL4&list=PLC51MBz7PMyyyR2l4gGBMFMMUfYmBkZxm&index=13 

 

반응형