Android AAC

DATA_Binding : RecyclerView in fragment

Machine_웅 2022. 3. 11. 15:12
728x90
반응형

<fragment>

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(inflater,R.layout.fragment_main_fragment, container, false)
        binding.fragment = this

        setAdapter()
        return binding.root
    }
    // 리싸이클러뷰 연결
    fun setAdapter() {
        dataAdapter = BoardAdapter(dataArr, this, backImage)

        binding.recyclerViewBoard.layoutManager =GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)
        //recyclerView_Board.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
        //recyclerView_Board.layoutManager = GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)

        binding.recyclerViewBoard.adapter = dataAdapter
        // recyclerView_Board.adapter = dataAdapter
    }

 

예제에서는 liveData를 사용하지 않았으나, 사용하는것을 권합니다.

 

 

<Adapter>

1. onCreateViewHolder 에서 생성된 바인딩 객체를 초기화 하고, inflate해준다.

 

2.뷰홀더 에서 뷰를 바인드 해주고, 데이터를 넣어주자


class BoardAdapter (
    val dataSet: MutableList<BoardData>,
    val inter : BoardInter,
    val backImgArr : ArrayList<Int>) :
    RecyclerView.Adapter<BoardAdapter.DViewHolder>(){

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): BoardAdapter.DViewHolder {
        // 기존
        // val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.item_board, viewGroup, false)
        // return ViewHolder(view)

        val binding : ItemBoardBinding =
            ItemBoardBinding.inflate(LayoutInflater.from(viewGroup.context),viewGroup,false)

        return DViewHolder(binding)
    }
    override fun onBindViewHolder(holder: BoardAdapter.DViewHolder, position: Int) {
        // 기존 사용방식
       /* holder.item_txt_title.text = dataSet.get(position).BoardName
        holder.item_layout.setBackgroundResource(backImgArr.get(position))
        holder.item_layout.setOnClickListener {inter.click(dataSet.get(position))}
        if(dataSet.get(position).BoardNew){
            holder.item_newNoti.visibility = View.VISIBLE
        }else{
            holder.item_newNoti.visibility = View.GONE
        }*/

        // 데이터바인딩
        holder.onBind(dataSet.get(position),backImgArr.get(position),inter)

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

    //기존 뷰홀더
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val item_txt_title: TextView
        val item_layout : LinearLayout
        val item_newNoti: TextView

        init {
            // Define click listener for the ViewHolder's View.
            item_txt_title = view.findViewById(R.id.item_txt_title)
            item_layout = view.findViewById(R.id.item_layout)
            item_newNoti = view.findViewById(R.id.item_newNoti)
        }
    }

    // 데이터 바인딩 뷰홀더
    class DViewHolder(val binding : ItemBoardBinding) : RecyclerView.ViewHolder(binding.root) {
        fun onBind(data : BoardData,  imageRes : Int ,inter: BoardInter){
            // 데이터 입력
            binding.itemTxtTitle.text = data.BoardName
            binding.itemLayout.setBackgroundResource(imageRes)
            binding.itemLayout.setOnClickListener { inter.click(data) }

            if(data.BoardNew){
                binding.itemNewNoti.visibility = View.VISIBLE
            }else{
                binding.itemNewNoti.visibility = View.GONE
            }

        }
    }

}

 

<item xml>

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:gravity="center"
        android:background="@drawable/btn_r_gray"
        android:layout_margin="10dp"
        android:id="@+id/item_layout">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_gravity="center"
                android:id="@+id/item_txt_title"
                android:text="test"
                android:textColor="#fff"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:layout_gravity="right"
                android:id="@+id/item_newNoti"
                android:text="test"
                android:textColor="#f00"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </FrameLayout>

    </LinearLayout>
</layout>

 

728x90
반응형

'Android AAC' 카테고리의 다른 글

MVVM : RecyclerView, LiveData  (0) 2022.03.28
DATA_Binding : Fragment  (0) 2022.03.10
MVVM LiveData (1)  (0) 2021.02.22
Android AAC : LiveData  (0) 2021.01.07
Android ACC : Data Binding  (0) 2021.01.06