How to I set up an interface listener for detecting a variable change in Kotlin. I successful implemented the following in Java, but am running into issues doing it in Kotlin:

接口:

public interface InterfaceRefreshList
    {
    public void refreshListRequest();
    }

包含侦听器的类:

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);
        }
    }

侦听器正在侦听的类:

public class FragmentBrowse extends Fragment
{
    public FragmentBrowse() /// Constructor
        {
        SignalChange.addRefreshListListener(() -> refreshList());
        }
    refreshList()
    {
    // do something
    }
}

要发出更改信号,请执行以下操作:

SignalChange.setRefreshList(true);

I can set up the interface and the signal class:

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)
    }

}

But I cannot setup the listener in the FragmentBrowse class. The fragment class doesn't allow constructors.

推荐答案

You can use built-in Kotlin delegates, for example:

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()
}

Add listeners like this:

SignalChange.refreshListListeners.add(object : InterfaceRefreshList {
    override fun refreshListRequest() {
        refreshList()
    }
})

OR

你可以使用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()
        }
    }
}

要添加侦听器,只需调用:

SignalChange.refreshListListeners.add(::refreshList)
//or
SignalChange.refreshListListeners.add { refreshList() }

fun refreshList() {

}

Kotlin相关问答推荐

Kotlin异步不并行运行任务

编译后的JavaFX应用程序立即以静默方式崩溃

Kotlin:类型不匹配:推断的类型已运行,但应等待

用vararg替换列表的设计弃用警告

如何在不基于数据 map 的情况下将图例添加到lets plot kotlin

如何使用 Kotlin Maven 更改 Minecraft 插件中的 Shulker GUI 标题

Kotlin:我可以将函数分配给 main 的伴随对象中的变量吗?

kotlin 父类具有依赖于抽象变量的变量

Kotlin Path.useLines { } - 如何不获取 IOException("Stream closed")?

Kotlin 插件之间的区别

为什么 KFunction2 在 Kotlin 中不是可表示类型?

Kotlin 中的 Java Scanner 相当于什么?

使用最新的 com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2 库时未找到 RxTextView 和其他小部件

以编程方式重新启动 Spring Boot 应用程序/刷新 Spring 上下文

Firebase 权限被拒绝

Kotlin:什么是 kotlin.String!类型

如何将map函数应用于Kotlin中的数组并更改其值?

ObserveForver是否了解生命周期?

kotlin 委托有什么用?

使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组