본문 바로가기
Aandroid Studio/기능

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

by 코끼리똥11 2024. 6. 10.

어뎁터 코드

package com.example.simplecontacts.adapter;

import static com.example.simplecontacts.R.*;

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

import com.example.simplecontacts.MainActivity;
import com.example.simplecontacts.R;
import com.example.simplecontacts.UpdateActivity;
import com.example.simplecontacts.model.Contact;

import java.util.ArrayList;

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder>{
    // 4. 어댑터 클래스의 멤버 변수 만든다.
    // 컨텍스트는 어떤 액티비티에서 리스트를 보여줄지 알아야 하기 때문에 필요.
    Context context;
    // 리사이클러뷰는 여러 개의 데이터를 리스트로 보여주는 것이니까 필요하다.
    ArrayList<Contact> contactArrayList;

    // 5. 생성자를 만들어준다.
    public ContactAdapter(Context context, ArrayList<Contact> contactArrayList) {
        this.context = context;
        this.contactArrayList = contactArrayList;
    }

    // 6. 아래 3개의 함수를 구현한다.

    // 화면과 뷰홀더를 연결시킨다.
    @NonNull
    @Override
    public ContactAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(layout.contact_row, parent, false);
        return new ContactAdapter.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);
    }

    // 데이터의 갯수를 나타낸다.
    @Override
    public int getItemCount() {
        return contactArrayList.size();
    }

    // 1. 뷰 홀더 클래스를 만든다.
    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView txtName;
        TextView txtPhone;
        ImageView imgDelete;

        CardView cardView;
        public ViewHolder(@NonNull View itemView){
            super(itemView);
            txtName=itemView.findViewById(R.id.txtName);
            txtPhone=itemView.findViewById(R.id.txtPhone);
            imgDelete=itemView.findViewById(R.id.imgDelete);
            cardView=itemView.findViewById(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("contact",contact);
                    context.startActivity(intent);
                }
            });
        }

    }
}

 

메인엑티비티 코드

package com.example.simplecontacts;

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

import androidx.activity.EdgeToEdge;
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.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.simplecontacts.adapter.ContactAdapter;
import com.example.simplecontacts.model.Contact;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    Button btnAdd;

    // 리사이클러뷰는 항상 같이 사용하는 멤버변수들이 있다.
    RecyclerView recyclerView;
    // 첫번쨰로, 여러 데이터를 처리해야 하니까, 어레이 리스트가 있어야 한다.
    ArrayList<Contact> contactArrayList = new ArrayList<>();
    // 두번쨰로, 메모리의 데이터를 화면에 보이게 하는 어댑터가 있어야 한다.
    ContactAdapter adapter;

    // Addactivity 로 부터 데이터를 받아야 하므로 엑티비티 리절트 런처를 만든다.
    ActivityResultLauncher<Intent> launcher =
            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                    new ActivityResultCallback<ActivityResult>() {
                        @Override
                        public void onActivityResult(ActivityResult o) {
                            // 내가 실행한 액티비티로 부터 , 데이터를 받아오는 부분
                            if ( o.getResultCode() == 1000){
                                Contact contact= (Contact) o.getData().getSerializableExtra("contact");
                                contactArrayList.add(contact);
                                // 메모리의 데이터가 바뀌면
                                // 리사이클러뷰의 화면에도 데이터를 표시하도록
                                // 어댑터의 함수를 이용해야 한다,
                                adapter.notifyDataSetChanged();

                                Log.i("CoNTACT MAIN",contact.name + "" +contact.phone);
                            }
                        }
                    });
    @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);
    }
}

 

정보 보내는 add엑티비티 코드

package com.example.simplecontacts;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.simplecontacts.model.Contact;
import com.google.android.material.snackbar.Snackbar;

public class AddActivity extends AppCompatActivity {
    EditText editName;
    EditText editPhone;
    Button btnSave;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        editName = findViewById(R.id.editName);
        editPhone = findViewById(R.id.editPhone);
        btnSave = findViewById(R.id.btnSave);

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String Name = editName.getText().toString().trim();
                String Phone = editPhone.getText().toString().trim();

                if (Name.isEmpty() || Phone.isEmpty()) {
                    Snackbar.make(btnSave, "비어있음", Snackbar.LENGTH_SHORT).show();
                    return;
                }

                Contact contact =new Contact(Name,Phone);

                // 현제 나를 실행시킨 엑티비티에 데이터를 돌려주는 코드
                Intent intent = new Intent();
                intent.putExtra("contact",contact);
                setResult(1000,intent);
                finish();


            }
        });


    }
}

 

수정하는 액티비티 코드

package com.example.simplecontacts;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.simplecontacts.model.Contact;

public class UpdateActivity extends AppCompatActivity {

    EditText editName;
    EditText editPhone;
    Button btnSave;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update); // 레이아웃 파일 설정

        // q받아오는 데이터가 있다.
        Contact contact = (Contact) getIntent().getSerializableExtra("contact");

        // EditText와 Button 초기화
        editName = findViewById(R.id.editName);
        editPhone = findViewById(R.id.editPhone);
        btnSave = findViewById(R.id.btnSave);

        // 받아온 연락처 정보를 EditText에 설정
        editName.setText(contact.name);
        editPhone.setText(contact.phone);

    }
}