Programing/Android(Kotlin)

[Android/Kotlin] 리사이클러뷰(Fragment) 구현

hye3193 2023. 8. 28. 13:01

안드로이드 뷰 바인딩

buildFeatures {
    viewBinding true
}

gradle 파일에 위와 같이 작성

 

val binding = FragmentBoardBinding.inflate(inflater, container, false)

onCreateView에 binding 변수를 만들어 준다

 

lateinit var binding: FragmentBoardBinding

혹은 class 위치에 전역 변수로 선언

* 보통 변수는 선언과 동시에 초기화를 해 줘야 하지만, lateinit를 사용할 경우 나중에 초기화가 가능(성능향상에 도움)

 

뷰 바인딩을 통해 findViewById 대신 binding.<id>로 객체를 쉽게 찾을 수 있다

코드의 길이가 줄어드는 편리한 점도 있지만, 바인딩 된 뷰에서만 객체를 찾기 때문에 findViewById를 사용하는 것에 비해 실수할 가능성이 줄어든다

 

리사이클러뷰 만들기

우선 새 xml 파일에 리사이클러뷰에 들어갈 아이템의 틀을 만들어 준다

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/boardBar"
    >

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/postingList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        tools:listitem="@layout/posting_list_view"
        />
</ScrollView>

그 후 메인 xml 파일에 위와 같이 리사이클러뷰를 추가해 준다

tools:listitem="@layout/" 부분에 아까 만든 xml 파일명을 넣어주면 된다

 

새 데이터 클래스를 생성해주고,

data class BoardItem(
    val title: String,
    val content: String
    )

위와 같이 사용할 변수들을 작성해준다

 

다음으로 어댑터를(Kotlin Class) 하나 생성해 준 다음

class BoardAdapter(private val itemList: ArrayList<BoardItem>) :
    RecyclerView.Adapter<BoardAdapter.BoardViewHolder>(){

    inner class BoardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
        val boardTitle: TextView = itemView.findViewById<TextView>(R.id.postListTitle)
        val boardContent: TextView = itemView.findViewById<TextView>(R.id.postListPV)
    }

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

    override fun onBindViewHolder(holder: BoardViewHolder, position: Int) {
        holder.boardTitle.text = itemList[position].title
        holder.boardContent.text = itemList[position].content
    }

    override fun getItemCount(): Int {
        return itemList.count()
    }
}

위와 같이 코드를 작성해 준다

 

메인 Fragment로 다시 돌아와서,

val itemList = ArrayList<BoardItem>()

클래스 내에 아이템 리스트 변수를 선언하고

 

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.postingList.adapter = BoardAdapter(itemList)
        binding.postingList.layoutManager = LinearLayoutManager(
            context, LinearLayoutManager.VERTICAL, false)
    }

onViewCreated 함수 내에 아까 만든 어댑터와 연결하고, 레이아웃 매니저도 지정해 준다

 

임시로 데이터를 추가해서 확인해 보기 위해 데이터 추가 용도의 함수를 하나 만들고,

itemList.add(BoardItem("<title>","<content>"))

위 함수를 사용해 테스트용 데이터를 몇 개 추가해보고 뷰가 잘 나오는지 확인하면 된다