본문 바로가기
안드로이드

[Android] RecylerView

by 엘딘 2022. 3. 21.

1. build.gradle

dependencies{
!   implementation 'androidx.recyclerview:recyclerview:1.1.0'           
!   implementation 'com.github.bumptech.glide:glide:4.11.0'
!   implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
!   implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
!   annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'     

	...
}

 

Dto list > parcel > item_view ( parcel 묶어서 데이터를 한번에 옮겨줌 id, name, 등등 한사람의 데이터를 묶어서 한번에 넘겨줌)

 

2. DataVo(data)

class DataVo(val name:String?, val id:String?, val address:String?, val pay:Int, val photo:String?) : Parcelable {
    constructor(parcel:Parcel) :this(
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readString()
    ){}

	// Parcel: 들어오는 부분
    override fun writeToParcel(parcel: Parcel, p1: Int) {
        parcel.writeString(name)
        parcel.writeString(id)
        parcel.writeString(address)
        parcel.writeInt(pay)
        parcel.writeString(photo)
    }

    override fun describeContents(): Int {
        return 0
    }

	// singleton
    companion object CREATOR : Parcelable.Creator<DataVo>{
        override fun createFromParcel(parcel: Parcel): DataVo {
            return DataVo(parcel)
        }

        override fun newArray(size: Int): Array<DataVo?> {
            return  arrayOfNulls(size)
        }
    }
}

 

 

3. CustomAdapter( ==> view_item_layout 을 만들어 준것)

// 변수 입력					
class CustomAdapter(private val context:Context, private val dataList: ArrayList<DataVo>) : RecyclerView.Adapter<ItemViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.view_item_layout, parent, false)
        return  ItemViewHolder(view)
    }

	// bind를 통해 list에 순서대로 데이터를 넣어줌
    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.bind(dataList[position], context)
    }

	// 여러개의 item을 만들어 주기 위해
    override fun getItemCount(): Int {
        return  dataList.size
    }
}

// class를 하나의 Dto라고 봐도 됨
// name, photo, address, pay를 묶은 하나의 item(일종의 Dto)
class ItemViewHolder(itemView:View) : RecyclerView.ViewHolder(itemView){
    private val userPhoto = itemView.findViewById<ImageView>(R.id.img_profile)
    private val userName = itemView.findViewById<TextView>(R.id.userNameTxt)
    private val userPay = itemView.findViewById<TextView>(R.id.payTxt)
    private val userAddress = itemView.findViewById<TextView>(R.id.addressTxt)

    // data -> resource (binding)
    fun bind(dataVo: DataVo, context: Context){
        // 사진
        // 사진 데이터가 비어있지 않을경우
        if(dataVo.photo != ""){
            // resourceId는 숫자로 표시, drawable: 이미지 파일이 있는 폴더
            val resourceId = context.resources.getIdentifier(dataVo.photo, "drawable", context.packageName)

		// 데이터가 제대로 넘어와서 0보다 클 경우
            if(resourceId > 0){
            	// resourceId를 userPhoto에 대입
                userPhoto.setImageResource(resourceId)
            }else{
            	// 0보다 크지 않을경우(외부 이미지 등) > 다시 로딩해서 item을 가져옴
                Glide.with(itemView).load(dataVo.photo).into(userPhoto)
            }
            
            // 사진 데이터가 없을 경우
        } else{
            userPhoto.setImageResource(R.mipmap.ic_launcher_round) // 이미지 없다. 아무 이미지나 뿌린다
        }

        // TextView 데이터를 세팅
        userName.text = dataVo.name
        userPay.text = dataVo.pay.toString()
        userAddress.text = dataVo.address

        // itemView 를 클릭시
        itemView.setOnClickListener{
            println(dataVo.name + " " + dataVo.photo)

            // ProfileDetailActivity 로 이동
            Intent(context, ProfileDetailActivity::class.java).apply {

                // 짐싸!
                putExtra("data", dataVo)

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

 

 

4. MainActivity

class MainActivity : AppCompatActivity() {

    var userList = arrayListOf<DataVo>(
        DataVo("김철수", "kcs", "서울시", 3000000, "kim"),
        DataVo("박상현", "psh", "부산시", 5000000, "park"),
        DataVo("최진형", "cjh", "광주시", 4000000, "choi"),
        DataVo("정수동", "jsd", "충주시", 4500000, "jung")
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var recyclerView = findViewById<RecyclerView>(R.id.recycler_view)

		// recyclerView에 adapter(view_item_layout)넣기
        val mAdapter = CustomAdapter(this, userList)
        recyclerView.adapter = mAdapter

		// recylerView에 layout 수직으로 넣기
        val layout = LinearLayoutManager(this)
        recyclerView.layoutManager = layout

        recyclerView.setHasFixedSize(true)
    }
}

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

[Android] Button  (0) 2022.03.23
[Android] Intent  (0) 2022.03.22
[Android] Fragment  (0) 2022.03.22
[Android] 2  (0) 2022.02.20
[Android] 1  (0) 2022.02.17

댓글