Переключение от одного фрагмента с 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 и передавать в него элемент