[안드로이드 - 코틀린] RecyclerView를 이용해 itemView, adapter 이용하기 2

2022. 9. 20. 17:44Android

1편에서는 간단히 로컬에서 데이터를 직접 추가해 데이터를 출력하였다

2편에서는 로컬 데이터가 아닌 Retrofit2를 이용한 데이터 호출을 이용해 RecyclerView를 생성해 볼 것이다.

 

참고 ) 시작 전 기본적으로 retrofit2을 사용할 줄 알아야 쉽게 이해할 수 있다. 필수는 아님 !!

 

현재 가져온 코드는 페이지에 표시되는 랭킹 시스템을 위해 만들어진 코드이다 

 

레트로핏 부분은 다 제외하고 DataList와 그 아래 RankRecyclerView만 확인하면 된다

result?.GetlLankplace(MySharedPreferences.getUserKey(mainActivity))?.enqueue(object : Callback<GuestRankDTO> {
            override fun onResponse(call: Call<GuestRankDTO>, response: Response<GuestRankDTO>) {
                if(response.isSuccessful){

                    val Response : GuestRankDTO? = response.body()

                    val DataList = Response?.result

                    if(DataList?.size != 0){
                        RankRecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
                        RankRecyclerView.adapter = DataList?.let { LankAdapter(it) }
                    }

                } else{
                    Log.d("response", "실패")
                }
            }
            override fun onFailure(call: Call<GuestRankDTO>, t: Throwable) {
                Log.d("GetLankPlace", "응답 에러" + t.message.toString())
            }
        })

1편에서와는 달리 DataList에 외부에서 가져온 결괏값을 넣어준다.

그리고 넣어준 데이터가 존재하는지 확인하고 RecyclerView.layoutManager를 실행한다

 

RankAdapter

class RankHolder(v : View) : RecyclerView.ViewHolder(v){

    var ranktext : TextView = v.findViewById(R.id.lankText)

}

class RankAdapter(val DataList: ArrayList<Responeresult>) : RecyclerView.Adapter<RankHolder>(){


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

    override fun onBindViewHolder(holder: RankHolder, position: Int) {

            holder.ranktext.text = "${position + 1}." +" "+ DataList[position].place

            if(position == 0){
                holder.ranktext.setTextColor(ContextCompat.getColor(holder.ranktext.context, R.color.rank1))
                holder.ranktext.setTypeface(null, Typeface.BOLD)
            } else if (position == 1){
                holder.ranktext.setTextColor(ContextCompat.getColor(holder.ranktext.context, R.color.rank2))
                holder.ranktext.setTypeface(null, Typeface.BOLD)
            } else if (position == 2){
                holder.ranktext.setTextColor(ContextCompat.getColor(holder.ranktext.context, R.color.rank3))
                holder.ranktext.setTypeface(null, Typeface.BOLD)
            }

            holder.itemView.setOnClickListener {
                val gp_key = DataList[position].gp_key
                val intent = Intent(holder.itemView.context, ImageClick_Actitivty::class.java)
                intent.putExtra("rank_data", gp_key)
                startActivity(holder.itemView.context, intent, null)

            }
    }

    override fun getItemCount(): Int {
        if(DataList.size < 5){
            return  DataList.size
        } else{
            return 5;
        }
    }


}

 

RankHolder, onCreateViewHolder는 1편과 똑같다 때문에 코드와 xml은 생략

 

onBindViewHolder에서는 앞에서 호출한 데이터를 holder로 데이터를  position 별로 넣어준다.

위에서는 그러데이션을 주기 위해 DataList를 1 ~ 3까지 색깔 효과를 준다 나머지는 4부터는 순서대로 정렬 처리를 해준다 

 

position은 호출된 정보를 0~n까지 넣어준다 또한 앞에서와는 다르게 itemView 자체에 onClickListner와 같은 이벤트를 넣어줘 클릭했을 때 발생하는 Action을 지정해준다 

 

1편에서 말했듯이 getItemCount는 데이터 숫자를 리턴해 주는데 랭킹 시스템 특성상 모든 데이터를 RecycerView 넣어주는 것이 아니라 특정 범위만을 출력해줘야 되므로 범위를 지정해 주었다 ( 데이터 사이즈가 5 이하면 그대로 출력 이상이면 5개만 출력 1~5위까지 있는 Rank )

 

 

랭킹 출력 Fragment
서버 데이터 삽입 결과