Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从可观测数据中获取元素的索引_Android_Rx Java_Frp_Rx Android - Fatal编程技术网

Android 从可观测数据中获取元素的索引

Android 从可观测数据中获取元素的索引,android,rx-java,frp,rx-android,Android,Rx Java,Frp,Rx Android,我开始学习RxJava。我有一个视图数组,我想使用ViewObservable.clicks()为每个视图设置一个OnClickListener。OnClickListener的实现将只调用一个方法,该方法取决于视图在数组中的位置(例如:populate(ViewPositionInArray)) 当务之急的解决方案是: for (int i = 0; i < views.length; i++) { final int finalI = i; view[i].setOnC

我开始学习RxJava。我有一个视图数组,我想使用
ViewObservable.clicks()
为每个视图设置一个
OnClickListener
OnClickListener
的实现将只调用一个方法,该方法取决于视图在数组中的位置(例如:
populate(ViewPositionInArray)

当务之急的解决方案是:

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);
        }
    });
}
for(int i=0;i
为了使用RxJava实现这一点,我想我需要做一些流链接。然而,我不知道我必须以一种优雅的方式使用什么功能。有什么建议吗

谢谢

这可能有用:

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]
}
private void gotTheList(){
for(int i=0;i{
填充(索引);
});
}
专用void填充(int索引){
//在mViews[索引]上执行某些操作
}

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

 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);
                    }
                });
            }
        });
Observable.range(0,views.length)
.订阅(新操作1(){
@凌驾
公共无效调用(整数){
视图[索引].setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
填充(索引);
}
});
}
});

我不确定是否理解您的问题。如果您正在查找视图的位置,我看不出这与Rx有什么关系?您的解决方案不起作用,因为
I
不是最终的,不能在onClick中使用。您需要一种从视图中获取索引的方法。通常,将其放入标记中
view[i].setTag(i)
然后
.map(view->(Integer)view.getTag()).map(this::populate)
.map(view->populate((Integer)view.getTag())
(这使用retrolambda来简化)。当然它不起作用,我只是在这里直接键入它来说明我的想法。使用标记是一个好主意,但您的回答表明,无论如何,我都必须遍历数组来设置标记。我正在寻找一种解决方案(但不确定是否可能)来避免任何迭代。始终存在
view.getParent().indexOfChild(view)
,但这将为您提供父视图组中的位置,可以从您处理的列表中取消相关。如果您有一个list
list.indexOf
也可以使用。