Cómo configuro un oyente de interfaz para detectar un cambio de variable en Kotlin. Implementé con éxito lo siguiente en Java, pero tengo problemas para hacerlo en Kotlin:
Interfaz:
public interface InterfaceRefreshList { public void refreshListRequest(); }Clase que contiene el oyente:
public class SignalChange { private static boolean refreshListSwitch; private static List<InterfaceRefreshList> refreshListListeners = new ArrayList<>(); public static void setRefreshList(boolean value) { refreshListSwitch = value; for(InterfaceRefreshList l : refreshListListeners) l.refreshListRequest(); } public static void addRefreshListListener(InterfaceRefreshList l) { refreshListListeners.add(l); } }Clase donde el oyente está escuchando:
public class FragmentBrowse extends Fragment { public FragmentBrowse() /// Constructor { SignalChange.addRefreshListListener(() -> refreshList()); } refreshList() { // do something } }Para señalar un cambio:
SignalChange.setRefreshList(true);Puedo configurar la interfaz y la clase de señal:
class SignalChange { private var refreshListSwitch: Boolean = false var setSwitch: Boolean get() = refreshListSwitch set(value) { refreshListSwitch = value } private var refreshListListeners = ArrayList<InterfaceRefreshPersonsList>() fun sendRefreshSignal() { for(l in refreshListListeners) l.refreshPersonsList() } fun addRefreshListListener(l: InterfaceRefreshPersonsList) { refreshListListeners.add(l) } }Pero no puedo configurar el oyente en la clase FragmentBrowse. La clase de fragmento no permite constructores.
Puede usar delegados integrados de Kotlin, por ejemplo:
object SignalChange { var refreshListListeners = ArrayList<InterfaceRefreshList>() // fires off every time value of the property changes var property1: String by Delegates.observable("initial value") { property, oldValue, newValue -> // do your stuff here refreshListListeners.forEach { it.refreshListRequest() } } } interface InterfaceRefreshList { fun refreshListRequest() }Agregue oyentes como este:
SignalChange.refreshListListeners.add(object : InterfaceRefreshList { override fun refreshListRequest() { refreshList() } })O
En lugar de la interfaz, puede usar lambda :
object SignalChange { var refreshListListeners = ArrayList<() -> Unit>() // fires off every time value of the property changes var property1: String by Delegates.observable("initial value") { property, oldValue, newValue -> // do your stuff here refreshListListeners.forEach { it() } } }Y para agregar un oyente simplemente llame:
SignalChange.refreshListListeners.add(::refreshList) //or SignalChange.refreshListListeners.add { refreshList() } fun refreshList() { }La forma sencilla de escuchar variables en KOTLIN
private var myVariableName by Delegates.observable(0) { property, oldValue, newValue -> Log.d(TAG,"New Value $newValue") Log.d(TAG,"Old Value $oldValue") }para obtener más información, lea https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.properties/-delegates/