【问题标题】:Getting the index of an element from an Observable从 Observable 中获取元素的索引
【发布时间】:2015-08-30 09:19:21
【问题描述】:

我开始学习 RxJava。我有一组视图,我想使用ViewObservable.clicks() 为每个视图设置一个OnClickListenerOnClickListener 的实现只会调用一个依赖于视图在数组中的位置的方法(例如: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 -&gt; (Integer) view.getTag()).map(this::populate).map(view -&gt; populate((Integer) view.getTag()))(这里使用 retrolambda 进行简洁)。
  • 肯定行不通,我只是直接在 SO 上输入了它来说明我的想法。使用标签是个好主意,但您的回答表明我必须遍历数组才能设置标签。我正在寻找一种解决方案(但不确定是否可能)以避免任何迭代。
  • 总是有view.getParent().indexOfChild(view),但这会给你在父视图组中的位置,可以从你处理的列表中去相关。如果你有一个列表list.indexOf 也可以。

标签: android rx-java frp rx-android


【解决方案1】:

这可以工作:

private void gotTheList() {
    for (int i = 0; i < mViews.length; i++) {
        setClick(mViews[i], i);
    }
}

private void setClick(View item, int index) {
    ViewObservable.clicks(item)
            .subscribe(onClickEvent -> {
                populate(index);
            });
}

private void populate(int index) {
    // do something on mViews[index]
}

【讨论】:

    【解决方案2】:

    这是我的尝试。当我需要通过可观察的变化来维护索引时,我通常使用范围运算符

     Observable.range(0,views.length)
                   .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    views[index].setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            populate(index);
                        }
                    });
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多