@Koshkasobaka

Как сделать, чтобы при нажатии на элемент RecyclerView открывался другой фрагмент?

Хочу сделать, чтобы при нажатии на элемент открывался фрагмент, где будет отображаться текст из этого элемента. Подобные темы читала, но не могу понять. Нужен интерфейс в адаптере, метод которого мы переопределяем в холдере... но как передать данные в активити, чтобы он пробросил их следующему фрагменту?
class NotesFragment : Fragment() {
    private var binding: FragmentNotesBinding? = null
    private val adapter = NoteAdapter()

    interface OpenFragment {
        fun addEditFragment() {
        }

        fun addDetailFragment(detail: String) {}
    }

    companion object {
        fun newInstance() = NotesFragment()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentNotesBinding.inflate(layoutInflater)
        return binding?.root
    }

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

        binding!!.rcList.layoutManager = GridLayoutManager(context, 2)
        binding!!.rcList.adapter = adapter
        binding!!.bAdd.setOnClickListener() {
            (activity as OpenFragment).addEditFragment()
        }
    }


    override fun onResume() {
        super.onResume()
        setFragmentResultListener("key") { key, bundle ->
            val result = bundle.getString("bundleKey")
            if (result != null) {
                adapter.addNote(result)
            }

        }
    }


    override fun onDestroy() {
        super.onDestroy()
        binding = null
    }
}


Адаптер:


class NoteAdapter : RecyclerView.Adapter() {
private val noteList = ArrayList()

class NoteHolder(item: View) : RecyclerView.ViewHolder(item) {
private val binding = MyNoteItemBinding.bind(item)
fun bind(note: String) = with(binding) {
tvMessage.text = note
}
}

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

override fun onBindViewHolder(holder: NoteHolder, position: Int) {
holder.bind(noteList[position])
}

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

fun addNote(note: String) {
noteList.add(note)
notifyDataSetChanged()
}
}
  • Вопрос задан
  • 737 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Нужен интерфейс в адаптере

Да.
, метод которого мы переопределяем в холдере

Нет.

Инстанс этого интерфейса должен приходить(в конструктор или сеттер) снаружу, а в холдере нужен ClickListener, в котором будет вызываться метод этого твоего интерфейса. В метод можешь передавать произвольные данные, какие есть в холдере(можно запоминать последний прибинженный в. этот холдер элемент, например).
Этот интерфейс имплементирует тот, кто владеет адаптером, например актвити.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы