169 похожих чатов

Кто нибудь знает, как вызвать метод фрагмента из адаптера RecyclerView?

65 ответов

35 просмотров

Прокинуть в адаптер листенер, который вызовет что угодно. Использовать LiveData.

Артем 🇺🇦-Oborozhny Автор вопроса

А контекст передать в конструктор адаптера?

Во-первых, он там уже есть. Во-вторых, зачем?

Артем 🇺🇦-Oborozhny Автор вопроса

Ну я создаю ViewModelProvider и туда передаю активити(ошибся с контекстом), от туда я его вызвать не могу.

В VM нельзя передавать ссылку на Activity и вообще на всё, что связано с lifecycle. Утечёт.

Артем 🇺🇦-Oborozhny Автор вопроса

Странно, requestActivity(или как то так) по гайду передаю и все норм

Артем 🇺🇦-Oborozhny Автор вопроса

Можно пример кода, если не трудно?

facepalm Если компилятор не ругается, то это не значит, что так можно. Активити помрет, ссылка на нее останентся в VM. Память утечёт. Нормальный способ из адаптера общаться с внешним миром - https://t.me/android_ru/1022437

лайвдата лишняя имхо, обычный колбек прокинуть и всё готово

Это как один из вариантов просто.

Какой гайд (или гад :) ) учит передавать активити в ВМ?

гугл. с их апишками всякими.

Артем 🇺🇦-Oborozhny Автор вопроса
Артем 🇺🇦-Oborozhny Автор вопроса

У меня сейчас вот так, что именно тут не правильно?Если requireActivity() Нельзя передавать, тогда что?

Ааа, извиняйте. В провайдер-то можно и нужно. Главное, чтобы активити в самой ВМ не сохранялось.

Артем 🇺🇦-Oborozhny Автор вопроса

То есть в принципе такой принцип вызова функции из адаптера приемлемый? BM это что?

Зачем ссылка на активити в viewModel?

Ну да, вполне. ВМ = VM = ViewModel

Артем 🇺🇦-Oborozhny Автор вопроса

Понял, спасибо

Это для провайдера. Ему надо. В VM это не попадет.

Зачем ты провайдер передаешь в адаптер? 🤔

Артем 🇺🇦-Oborozhny Автор вопроса

Это обращение к vm. Я так могу методы вызывать из vm

Передается не провайдер, а VM.

Я же тебе дал дельный совет с интерфейсом, а ты заговнокодил)

Ну да, но разве это нормально?

Артем 🇺🇦-Oborozhny Автор вопроса

😑

Но так адаптер жестко привязывается к конкретной VM. По идее, он ничего не должен знать об окружающем мире и должен общаться с ним только через колбэки.

Артем 🇺🇦-Oborozhny Автор вопроса

Как это сделать?

Я тебе ответил уже на этот вопрос, передай интерфейс

Так же, как это делается в разных setOnClickListener, например.

Артем 🇺🇦-Oborozhny Автор вопроса

Ок, не думал, что с вью моделью это будет норм.

При чем тут vm?

Артем 🇺🇦-Oborozhny Автор вопроса

Не совсем понимаю о чем вы

Джаву/Котлин изучал?

В адаптер вместо ВМ следует передавать листенер и его дергать из адаптера. Так адаптер будет независим от остальных компонентов приложения.

Артем 🇺🇦-Oborozhny Автор вопроса

Предостережение, я с viewmodel недавно

Артем 🇺🇦-Oborozhny Автор вопроса

Джаву год, котлин полтора месяца

Кнопкам листенеры назначали же?

В простых случаях можно и лямбду чтоб интерфейсы не плодить

Если понимаешь, что такое интерфейс, то не составит труда создать его в адаптере и передать реализацию в адаптер из фрагмента

+, если котлин

Артем 🇺🇦-Oborozhny Автор вопроса

Понятное дело, просто в параметры не передавал листенер, может просто думаю о чем то другом

Это то же самое, только сбоку :)

Какой язык? Котлин?

Артем 🇺🇦-Oborozhny Автор вопроса

Да

в жабе вроде тоже можно лямбды передавать

Значит ты лямбду передавал, сделай аналогично в адаптере

Артем 🇺🇦-Oborozhny Автор вопроса

Функцию всмысле?

private var callback: ((YourObject)->Unit)? = null

Слушай, почитай книгу, это основы

Артем 🇺🇦-Oborozhny Автор вопроса

Если честно, как оскорбление звучит( ведь я достаточно много времени потратил на язык, а то что я просто думаю о другой реализации не значит, что я вообще ничего не знаю.

Артем 🇺🇦-Oborozhny Автор вопроса

🙏 спасибо

Я тебе прямо код скинул как сделать.

Но ведь ты не понял, что такое лямбда🤷‍♂️

Артем 🇺🇦-Oborozhny Автор вопроса

Так зачем мне создавать интерфейс для простой задачи? Мне уже объяснили нормальную реализацию

Артем 🇺🇦-Oborozhny Автор вопроса

С чего вы взяли?

Проще некуда, какая лучше?

Потому что это понял не только я

Артем 🇺🇦-Oborozhny Автор вопроса

😑 ммм ясно

Зачем? Ты создаешь один интерфейс который далее будешь юзать во всех остальных адаптерах, в интерфейс перелаешь view и position и он получается универсальный

Можно же дженериком сделать

Артем 🇺🇦-Oborozhny Автор вопроса

Какие вы все крутые разработчики, все всё поняли, молодцы прям. Один другого краше

Тебя никто не оскорблял. Указали на ошибки, сказали как сделать лучше. По итогу мы и виноваты ещё🙂

Артем 🇺🇦-Oborozhny Автор вопроса

Ты себе сам это придумал

Отдельный интерфейс для общения с адаптером - это хорошо.

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

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта