본문 바로가기
Android

Android recyclerView, adapter

by leopard4 2023. 2. 1.

리사이클뷰를 위한 사전작업

1.DB 테이블에 데이터가 있어야함.

2.하나의 행을 보여줄 XML을 작성 / 리사이클뷰를 보여줄 XML을 작성

 

리사이클뷰 원리

1.DB에서 가져온 하나의 행 정보를 기반으로 만든 XML을 

2.어댑터클래스를 만들어 증식시킨다?(여러개로 만든다는것)

3.그리고 Activity에서 리사이클뷰로 보여주는 코드를 작성.

 

# 이것을 응용하면 사진앨범 같이 다차원의 배치도 가능함

 

 

adapter 코드

package com.leopard4.contactapp.adapter;

// 1. RecyclerView.Adapter 를 상속받는다.

// 2. 상속받은 클래스가 abstract 이므로, unimplemented method 오버라이드!

import android.content.Context;
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 com.leopard4.contactapp.R;
import com.leopard4.contactapp.model.Contact;

import java.util.List;


// 6. RecyclerView.Adapter 의 데이터 타입(<ContactAdapter.viewHolder>)을 적어주어야 한다.
//    우리가 만든 ViewHolder 로 적는다.

// 7. 빨간색 에러가 뜨면, 우리가만든 ViewHolder 로,
//    onCreateViewHolder, onBindViewHolder 함수도 변경해준다.
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.viewHolder> {

    // 5. 어댑터 클래스의 멤버변수와 생성자를 만들어 준다.
    Context context;
    List<Contact> contactList;

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

    // 8. 오버라이드 함수 3개를 전부 구현해 주면 끝!
    @NonNull
    @Override
    public ContactAdapter.viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // xml 파일을 연결하는 작업
        // 재사용 가능한 코드이므로 리턴클래스명, 파일명만 바꿔주자. (contact_row)
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.contact_row, parent, false);
        return new ContactAdapter.viewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ContactAdapter.viewHolder holder, int position) {
        // 뷰에 데이터를 셋팅한다!
        // 파라미터 holder = 행 하나하나를 의미한다. position = 몇번째 행인지를 의미한다.
        Contact contact = contactList.get(position);

        holder.txtName.setText( contact.name );
        holder.txtPhone.setText( contact.phone );

    }

    @Override
    public int getItemCount() {
        // 전체 데이터의 갯수를 적어준다.
        return contactList.size();
    }

    // 3. ViewHolder 클래스를 만든다.
    //    이 클래스는 row.xml 화면에 있는 뷰를 연결시키는 클래스다.
    //    ViewHolder 클래스는 RecyclerView.ViewHolder 를 상속받는다.
    public class viewHolder extends RecyclerView.ViewHolder {

        TextView txtName, txtPhone;
        ImageView imgDelete;
       
        // 4. 생성자를 만든다.
   	    //    생성자에서, 뷰를 연결시키는 코드를 작성하고,
        //    클릭 이벤트도 작성한다.
        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);
        }
    }
}

main 코드

package com.leopard4.contactapp;

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

import com.leopard4.contactapp.adapter.ContactAdapter;
import com.leopard4.contactapp.data.DatabaseHandler;
import com.leopard4.contactapp.model.Contact;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    Button btnAdd;

    // 리사이클러뷰를 사용할때!
    // RecyclerView, Adapter, ArrayList(실제데이터) 를 셋트로 적어라!
    RecyclerView recyclerView;
    ContactAdapter adapter;
    ArrayList<Contact> contactList;

    @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(this));

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                startActivity(intent);

            }
        });

        // DB에서 데이터를 가져와서, 리사이클러뷰에 뿌려준다.
        DatabaseHandler db = new DatabaseHandler(MainActivity.this);
        contactList = db.getAllContacts();
        db.close();

        // 어댑터를 생성하고,
        adapter = new ContactAdapter(MainActivity.this, contactList);
        // 리사이클러뷰에 셋팅
        recyclerView.setAdapter(adapter);

    }

}