Переключение от одного фрагмента с RecycleView в другой с помощью onClick(). Koltlin

Я создала интерфейс для перехода от одного фрагмента к другому, но из-за того, что класс адаптера реализован в отдельном файле, функция onClick() не видит интерфейс. Не понимаю как иначе организовать переход или что переделать.

class HabitListFragment : Fragment() {

interface Callbacks {
    fun onHabitSelected(habitID: UUID)
}

private var callbacks: Callbacks? = null
private var adapter: HabitAdapter = HabitAdapter(emptyList())
private lateinit var fabAdd: FloatingActionButton
private lateinit var habitRecyclerView: RecyclerView

private var _binding: FragmentHabitListBinding? = null
private val binding
    get() = _binding ?: throw IllegalStateException("HabitItemBinding binding is null")

private val habitListViewModel: HabitListViewModel by lazy {
    ViewModelProvider(this).get(HabitListViewModel::class.java)
}

override fun onAttach(context: Context) {
    super.onAttach(context)
    callbacks = context as Callbacks?
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    _binding = FragmentHabitListBinding.inflate(layoutInflater, container, false)
    initial()
    return binding.root
}

private fun initial() {
    habitRecyclerView = binding.rvHabits
    habitRecyclerView.layoutManager = LinearLayoutManager(context)
    habitRecyclerView.adapter = adapter
    fabAdd = binding.fabAdd

}

private fun updateUI(habits: List<Habit>) {
    adapter = HabitAdapter(habits)
    habitRecyclerView.adapter = adapter
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    habitListViewModel.habitListLiveData.observe(
        viewLifecycleOwner,
        Observer { habits ->
            habits?.let { updateUI(habits) }
        })

    fabAdd.setOnClickListener {
        val controller = findNavController()
        controller.navigate(R.id.habitFragment)
    }

}

class HabitAdapter(private var habits: List) : RecyclerView.Adapter<HabitAdapter.HabitViewHolder>(){

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


class HabitViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener{
    val habitName: TextView = itemView.findViewById(R.id.tvHabitName)
    val description: TextView = itemView.findViewById(R.id.tvDescription)

    init {
        itemView.setOnClickListener(this)
    }

    override fun onClick(v: View?) {

    }

}

override fun onBindViewHolder(holder: HabitViewHolder, position: Int) {
    val habit = habits[position]

    holder.habitName.text = habits[position].name
    holder.description.text = habits[position].descript
}

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

fun setList(list: List<Habit>) {
    habits = list
    notifyDataSetChanged()
}

}


Ответы (1 шт):

Автор решения: Wlad

вам надо прокинуть колбэк из вашего адаптера.

class HabitAdapter(private var habits: List, val myClick :()->Unit) :
...
init {
        itemView.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
      myClick()
    }
...
  adapter = HabitAdapter(habits){
// код для клика
}

если клик отличается в зависимости от элемента, то надо его реализовывать в onBindViewHolder и передавать в него элемент

→ Ссылка