본문 바로가기
Android

[Android/Kotlin] firebase 데이터로 recyclerView 만들기

by noddu 2022. 3. 5.
728x90
반응형

Realtime Database의 Product 테이블

 


 

package com.example.companymarket.Data;

import android.net.Uri;

public class Product {
    private String Pro_uid;
    private String Pro_Image;
    private String Pro_name;
    private int Pro_price;
    private String Pro_status;
    private String Pro_content;


    public Product(){

    }

    public Product(String Pro_uid, Uri Pro_Image, String Pro_name, int Pro_price, String Pro_status, String Pro_content) {
        this.Pro_uid = Pro_uid;
        this.Pro_Image = Pro_Image.toString();
        this.Pro_name = Pro_name;
        this.Pro_price = Pro_price;
        this.Pro_status = Pro_status;
        this.Pro_content = Pro_content;
    }

    public String getPro_uid() {
        return Pro_uid;
    }

    public void setPro_uid(String pro_uid) {
        Pro_uid = pro_uid;
    }

    public String getPro_Image() {
        return Pro_Image;
    }

    public void setPro_Image(String pro_Image) {
        Pro_Image = pro_Image;
    }

    public String getPro_name() {
        return Pro_name;
    }

    public void setPro_name(String pro_name) {
        Pro_name = pro_name;
    }

    public int getPro_price() {
        return Pro_price;
    }

    public void setPro_price(int pro_price) {
        Pro_price = pro_price;
    }

    public String getPro_status() {
        return Pro_status;
    }

    public void setPro_status(String pro_status) {
        Pro_status = pro_status;
    }

    public String getPro_content() {
        return Pro_content;
    }

    public void setPro_content(String pro_content) {
        Pro_content = pro_content;
    }

    @Override
    public String toString() {
        return "Product{" +
                "Pro_uid='" + Pro_uid + '\'' +
                ", Pro_Image='" + Pro_Image + '\'' +
                ", Pro_name='" + Pro_name + '\'' +
                ", Pro_price=" + Pro_price +
                ", Pro_status='" + Pro_status + '\'' +
                ", Pro_content='" + Pro_content + '\'' +
                '}';
    }
}

Product class를 작성한다

 


 

private var database: FirebaseDatabase? = null
private var databaseReference: DatabaseReference? = null
private var arrayList: ArrayList<Product>? = null

Fragment에 FirebaseDatabase, DatabaseReference, Product class의 데이터를 담을 arrayList를 선언한다

 


 

arrayList = ArrayList()
database = FirebaseDatabase.getInstance() // 파이어 데이터베이스 연동
databaseReference = database!!.getReference("Product") // 파이어베이스 Product 테이블 연결

 

Product 테이블을 연결하고

 


databaseReference!!.addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        // 파이어 베이스 데이터 받아옴
        arrayList!!.clear() //배열리스트 초기화
        for (snapshot1 in snapshot.children) {
            val product = snapshot1.getValue(
                Product::class.java
            )
            arrayList!!.add(product!!)
            Log.d("product_data", arrayList.toString())

            mainAdapter.getMainAdapter(arrayList!!)
            binding.mainRecyclerview.adapter = mainAdapter //setAdapter
        }
    }

    override fun onCancelled(error: DatabaseError) {
        Log.d("user_error", error.toException().toString())
    }
})

Product class에 정의해둔 형태로 arrayList에 넣고

 

mainAdapter의 getMainAdapter함수를 실행시킨다

그리고 recyclerview를 mainAdapter로 setAdapter해준다

 

 

 

D/product_data: [Product{Pro_uid='6xOHCf5LYSS3a7aUH2d7u8XLPZw2', Pro_Image='content://media/external/images/media/3893', Pro_name='uidtest', Pro_price=123, Pro_status='aaa', Pro_content='aa'}]

Log로 확인해보니 arrayList에 잘 쌓인다

 


class MainAdapter : RecyclerView.Adapter<MainAdapter.ViewHolder> () {

    private var arrayList: ArrayList<Product> = arrayListOf()

    fun getMainAdapter(productDataset : ArrayList<Product>) {
        this.arrayList = productDataset
        Log.d("array_data", arrayList.toString())
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): ViewHolder {
        val binding = MainListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

    // ViewHolder의 bind 메소드를 호출한다.
    override fun onBindViewHolder(holder: MainAdapter.ViewHolder, position: Int) {
        holder.bind(arrayList[position])
    }


    override fun getItemCount(): Int {
        return arrayList.size
    }

    class ViewHolder(private val binding: MainListBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(data: Product){
            //binding.productImage.setImageResource("${data.pro_Image}")
            Glide.with(itemView).load("${data.pro_Image}").into(binding.productImage)
            binding.productUid.text = "Uid: ${data.pro_uid}"
            binding.productName.text = "${data.pro_name}"
            binding.productPrice.text = "${data.pro_price}원"
            binding.productStatus.text = "${data.pro_status}"
            binding.productContent.text = "${data.pro_content}"
            }
        }
    }

Adapter에서도 getMainAdpater함수에서 arrayList의 Log가 동일하게 찍히고

정해둔 itemlist를 binding해서 가져온 데이터를 ViewHolder에서 setText해줬다

 


itemView.setOnClickListener {
    Intent(itemView.context, ContentActivity::class.java).apply {
        putExtra("product_Image",data.pro_Image)
        putExtra("product_Uid",data.pro_uid)
        putExtra("product_name",data.pro_name)
        putExtra("product_price",data.pro_price.toString())
        putExtra("product_status",data.pro_status.toString())
        putExtra("product_content",data.pro_content.toString())

        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    }.run { itemView.context.startActivity(this) }
}

 

위의 bind함수에서

각 아이템들은 itemView인데 클릭하면 각 아이템의 데이터를 가지고 Intent하게 해줬다

 

반응형