【发布时间】:2019-06-16 06:03:07
【问题描述】:
如何设置接口侦听器以检测 Kotlin 中的变量更改。我在 Java 中成功实现了以下功能,但在 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);
我可以设置接口和信号类:
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)
}
}
但我无法在 FragmentBrowse 类中设置监听器。片段类不允许构造函数。
【问题讨论】:
-
您遇到了哪些问题?为什么不简单地在 Java 代码上运行 Java 到 Kotlin 的转换器?
-
转换器并非如此简单地工作。例如,我必须做的私有变量的静态设置器: private var refreshListSwitch: Boolean = false var setSwitch: Boolean get() = refreshListSwitch set(value) { refreshListSwitch = value }
-
你为什么要这么做?这看起来完全没有必要。无论如何,您没有回答您在使用 Kotlin 代码时遇到的具体问题。
-
查看修改后的代码
-
添加监听的代码需要放在initializer block中。 IntelliJ IDEA 中内置的 Java 到 Kotlin 转换器能够自动执行此转换。