Android 从可观测数据中获取元素的索引
我开始学习RxJava。我有一个视图数组,我想使用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
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)
,但这将为您提供父视图组中的位置,可以从您处理的列表中取消相关。如果您有一个listlist.indexOf
也可以使用。