개발/안드로이드

Android - RecyclerView

웅'jk 2023. 2. 1. 11:07

RecyclerView 는 흔히 사용하는 카카오톡 채팅목록 같은 비슷한형식의 리스트를 만드는 방법입니다.

이전 sqlite3 글에서 사용했던 클래스를 그대로 이용하니 참고하시길 바랍니다.

 

UI code

<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

 

JAVA code

 

1. RecyclerView 는 adapter 라는게 필요합니다. 이 adapter 는 RecyclerView 에 표시될 데이터를 연결합니다.

 

이 RecyclerView 에 하나의 리스트도 ui가 필요하기 때문에 새로운 xml 파일을 만들어보겠습니다.

 

이름은 Contact_row 로 하며 다음과 같이 구성되어있는 UI 입니다.

2. adapter를 작성하겠습니다.

 

ContactAdapter 클래스를 만들어 여기에 필요한 코드를 작성하겠습니다.

package com.rrc0777.contactapp.adapter;

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.rrc0777.contactapp.R;
import com.rrc0777.contactapp.model.Contact;

import java.util.List;

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

// 7. 빨간색 에러가 뜨면 우리가 만든 ViewHolder 로,
//    onCreateViewHolder,onBindViewHolder 을 바꾼다.

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

// 2. 상속받은 추상클래스의 추상메소드를 정의합니다.
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. 오버라이드 된 함수를 전부 구현한다.
    @NonNull
    @Override
    public ContactAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 8-1 . xml 파일을 연결하는 작업
        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) {
        // 8-2. 뷰에 데이터를 셋팅한다.
        Contact contact = contactList.get(position);

        holder.txtname.setText(contact.name);
        holder.txtphone.setText(contact.phone);

    }

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

    // 3. ViewHolder 클래스를 만든다.
    //    이 클래스는 contact_row.xml 화면에 있는 부분을 연결시키는 클래스입니다.
    //    RecyclerView.ViewHolder 상속받는다.

    // 4. 생성자를 만든다.
    //    생성자에서 뷰를 연결시키는 코드를 작성하고, 클릭 이벤트로 작성한다.



    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView txtname;
        TextView txtphone;
        ImageView imgdelete;
        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);
        }
    }

}

 

 

3. 이제 MainActivity에서 recyclerview와 dapter를 연결하겠습니다.

// 리사이클러뷰 변수
RecyclerView recyclerView;
// 우리가 만든 어뎁터 변수
ContactAdapter adapter;
// 어댑터에 집어넣을 데이터
ArrayList<Contact> contactArrayList;

// 리사이클러뷰를 연결
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

// 데이터를 db로부터 가져온다. 이전 sqlite3 글 참고
DatabaseHandler db = new DatabaseHandler(MainActivity.this);
contactArrayList = db.getAllContact();
db.close();

// 데이터를 어댑터에 전달한다.
adapter = new ContactAdapter(MainActivity.this,contactArrayList);

// 어댑터를 리사이클러뷰에 적용한다.
recyclerView.setAdapter(adapter);

'개발 > 안드로이드' 카테고리의 다른 글

Android - 객체 전달을 위한 Serializable  (0) 2023.02.01
Android - RecyclerView의 Intent  (0) 2023.02.01
Android - SQLite3  (0) 2023.01.31
Android - SharedPreferences  (0) 2023.01.31
Android - Intent  (0) 2023.01.31