【发布时间】:2015-08-30 09:19:21
【问题描述】:
我开始学习 RxJava。我有一组视图,我想使用ViewObservable.clicks() 为每个视图设置一个OnClickListener。 OnClickListener 的实现只会调用一个依赖于视图在数组中的位置的方法(例如:populate(viewPositionInTheArray))。
一个命令式的解决方案将是这个:
for (int i = 0; i < views.length; i++) {
final int finalI = i;
view[i].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
populate(finalI);
}
});
}
为了使用 RxJava 做到这一点,我想我需要做一些流链接。但是,我不知道必须以优雅的 FRP 方式使用哪些功能。有什么建议吗?
谢谢
【问题讨论】:
-
不确定我理解你的问题。如果您正在寻找视图的位置,我看不出这与 Rx 有什么关系?
-
您的解决方案不起作用,因为
i不是最终的,不能在onClick 中使用。您需要一种从视图中获取索引的方法。通常,将其放在标签中。view[i].setTag(i)然后是.map(view -> (Integer) view.getTag()).map(this::populate)或.map(view -> populate((Integer) view.getTag()))(这里使用 retrolambda 进行简洁)。 -
肯定行不通,我只是直接在 SO 上输入了它来说明我的想法。使用标签是个好主意,但您的回答表明我必须遍历数组才能设置标签。我正在寻找一种解决方案(但不确定是否可能)以避免任何迭代。
-
总是有
view.getParent().indexOfChild(view),但这会给你在父视图组中的位置,可以从你处理的列表中去相关。如果你有一个列表list.indexOf也可以。
标签: android rx-java frp rx-android