본문 바로가기
Android Studio

[Android Studio] RecyclerView와 Adapter를 이용해 리스트를 화면에 표시하는 방법

by dong_su 2023. 12. 28.

RecyclerView는 여러개의 데이터를 목록으로 처리할때 사용한다.

 

우선 하나의 행에 대한 화면개발을 먼저 한다. (파일명 contact_row, LinearLayout로 파일 생성)

 

화면을 구성한다.

 

adapter 패키지를 만들고 안에 클래스를 만든다.

 

만든 클래스(ContactAdapter) 전체 코드

package com.dongsu.contacts.adapter;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
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.appcompat.app.AlertDialog;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.dongsu.contacts.MainActivity;
import com.dongsu.contacts.R;
import com.dongsu.contacts.UpdateActivity;
import com.dongsu.contacts.model.Contact;

import java.util.ArrayList;

// 2. RecyclerView.Adapter 상속한다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {

    // 3. 멤버변수와 생성자를 만든다.
    Context context;
    ArrayList<Contact> contactArrayList;

    public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
        this.context = context;
        this.contactArrayList = contactArrayList;
    }

    // 4. 오버라이딩 함수를 구현한다.
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Contact contact = contactArrayList.get(position);

        holder.txtName.setText(contact.name);
        holder.txtPhone.setText(contact.phone);
        holder.txtAddress.setText(contact.address);
    }

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

    // 1. 메모리에 있는 데이터를 연결할 viewHolder를 만든다.
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView txtName;
        TextView txtPhone;
        TextView txtAddress;
        ImageView imgDelete;
        CardView cardView;

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

            txtName = itemView.findViewById(R.id.txtName);
            txtPhone = itemView.findViewById(R.id.txtPhone);
            txtAddress = itemView.findViewById(R.id.txtAddress);
            imgDelete = itemView.findViewById(R.id.imgDelete);
            cardView = itemView.findViewById(R.id.cardView);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, UpdateActivity.class);

                    int index = getAdapterPosition();
                    Contact contact = contactArrayList.get(index);

                    intent.putExtra("index", index);
                    intent.putExtra("name", contact.name);
                    intent.putExtra("phone", contact.phone);
                    intent.putExtra("address", contact.address);

                    ((MainActivity) context).launcher.launch(intent);
                }
            });

            imgDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ShowAlertDialog();
                }
            });
        }

        private void ShowAlertDialog() {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setCancelable(false);
            builder.setTitle("주소록 삭제");
            builder.setMessage("정말 삭제하시겠습니까?");

            builder.setNegativeButton("No", null);

            builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // 몇번째 데이터를 선택했는지 알아야 한다.
                    int index = getAdapterPosition();

                    // 어레이리스트에서 삭제하고
                    contactArrayList.remove(index);

                    // 화면에 보여준다.
                    notifyDataSetChanged();
                }
            });

            builder.show();
        }
    }
}

 

위 코드 작성 순서 

// 1. 메모리에 있는 데이터를 연결할 ViewHolder를 만든다.
 public class ViewHolder extends RecyclerView.ViewHolder {}
 
// 2. RecyclerView.Adapter<현재클래스명.ViewHolder> 상속한다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {}

// 3. 멤버변수와 생성자를 만든다.
    Context context;
    ArrayList<Contact> contactArrayList;

    public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
        this.context = context;
        this.contactArrayList = contactArrayList;
    }
    
// 4. 오버라이딩 함수를 구현한다.    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Contact contact = contactArrayList.get(position);

        holder.txtName.setText(contact.name);
        holder.txtPhone.setText(contact.phone);
        holder.txtAddress.setText(contact.address);
    }

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

 

위 코드 작성 후 리사이클러뷰를 구현할 메인 액티비티로 돌아와 화면에 연결하고 표시해주는 코드 작성한다.

 

메인 액티비티 코드

package com.dongsu.contacts;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.dongsu.contacts.adapter.ContactAdapter;
import com.dongsu.contacts.model.Contact;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    Button btnAdd;
    RecyclerView recyclerView;
    ContactAdapter adapter;
    ArrayList<Contact> contactArrayList = new ArrayList<>();
    public ActivityResultLauncher<Intent> launcher =
            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                    new ActivityResultCallback<ActivityResult>() {
                        @Override
                        public void onActivityResult(ActivityResult o) {
                            if (o.getResultCode() == 200){
                                Contact contact = (Contact) o.getData().getSerializableExtra("contact");
                                contactArrayList.add(contact);

                                adapter.notifyDataSetChanged();
                            } else if (o.getResultCode() == 300) {
                                int index = o.getData().getIntExtra("index", -1);
                                Contact contact = (Contact) o.getData().getSerializableExtra("contact");
                                contactArrayList.set(index, contact);

                                adapter.notifyDataSetChanged();
                            }
                        }
                    });

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

        btnAdd = findViewById(R.id.btnAdd);
        
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                launcher.launch(intent);
            }
        });

        // 어뎁터 만들고 화면에 적용
        adapter = new ContactAdapter(MainActivity.this, contactArrayList);
        recyclerView.setAdapter(adapter);

    }
}