I'm having trouble using the same adapter for two of my Recycler Views

Viewed 4

I am trying to use the same adapter for two of my recycler view. Yet, I keep getting this error wherein my layout for one of my fragments keeps getting skipped. I make use of two fragments in a Tab Layout and the data being passed on the first fragment keeps getting skipped, along with its layout. The recycler view of the two fragments have the same layout. The data of the second fragment is the only one getting kept and the first one is skipped. The recycler view that is supposed to show on the second fragment is shown on the first fragment, as the data from the first one is skipped, leaving the second fragment blank. The specific error in the debugger is E/RecyclerView: No adapter attached; skipping layout.

Here is my code:

First Recycler View Fragment

 private lateinit var swipeRefreshLayout:SwipeRefreshLayout
private lateinit var loanRecRcv:RecyclerView
private var list: ArrayList<LoanRecordModel> = ArrayList()
private var loanRecRcvAdapter = LoanRecRcvAdapter(list, this)

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    _binding = FragmentOpenLoansBinding.inflate(inflater, container, false)
    val root: View = binding.root

   // getData()

    loanRecRcvAdapter.setData(listOf(
        LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open")
    ))

    return root
}

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

    initView()

    loanRecRcv.apply{
        layoutManager = LinearLayoutManager(activity)
        adapter = loanRecRcvAdapter

    }
}

override fun OnClick(position: Int) {
    Toast.makeText(activity, list[position].loan_type,Toast.LENGTH_SHORT).show()
}

private fun initView() {
    swipeRefreshLayout = requireActivity().findViewById(R.id.swipeRefresh)
    loanRecRcv = requireActivity().findViewById(R.id.loanRecRcv)
}

Second Recycler View Fragment

 private lateinit var swipeRefreshLayout: SwipeRefreshLayout
private lateinit var loanRecRcv: RecyclerView
private var list: ArrayList<LoanRecordModel> = ArrayList()
private var loanRecRcvAdapter = LoanRecRcvAdapter(list, this)

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    _binding = FragmentClosedLoansBinding.inflate(inflater, container, false)
    val root: View = binding.root

    // getData()

    loanRecRcvAdapter.setData(listOf(
        LoanRecordModel("", "Regular Loan", "12/05/2022", "Closed"),
        LoanRecordModel("", "Petty Cash Loan", "05/04/2022", "Closed")

    ))

    // Inflate the layout for this fragment
    return root
}

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

    initView()

    loanRecRcv.apply{
        layoutManager = LinearLayoutManager(activity)
        adapter = loanRecRcvAdapter

    }
}

override fun OnClick(position: Int) {
    Toast.makeText(activity, list[position].loan_type, Toast.LENGTH_SHORT).show()
}

private fun initView() {
    swipeRefreshLayout = requireActivity().findViewById(R.id.swipeRefresh)
    loanRecRcv = requireActivity().findViewById(R.id.loanRecRcv)
}

Recycler View Adapter of the Two Fragments

class LoanRecRcvAdapter( private var list: List = emptyList(), val listener:MyOnClickListener ) : RecyclerView.Adapter<LoanRecRcvAdapter.MyViewHolder>() {

inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

    val typeTv = itemView.findViewById<TextView>(R.id.loanType)
    val dateTv = itemView.findViewById<TextView>(R.id.dueDate)
    init {
        itemView.setOnClickListener{
            val position = adapterPosition
            listener.OnClick(position)
        }
    }
}

fun setData(data: List<LoanRecordModel>) {
    // calling toList makes a new list object - even if the 'data' list object gets
    // modified later, we have our own internal list object that won't be affected
    list = data.toList()
    // update the display however you like
    notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.record_layout,parent,false)

    return MyViewHolder(view)
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    val item = list[position]
    holder.apply {
        typeTv.text = item.loan_type
        dateTv.text = item.due_date
    }
}

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

interface MyOnClickListener{
    fun OnClick(position: Int)
}
0 Answers
Related