GVKun编程网logo

JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?(javafx controller)

7

在本文中,我们将带你了解JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?在这篇文章中,我们将为您详细介绍JavaFX中ObservableList的使用是否违反了模

在本文中,我们将带你了解JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?在这篇文章中,我们将为您详细介绍JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?的方方面面,并解答javafx controller常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的'Observable >>'不可分配给'Observable '类型、android – Observable返回类型必须参数化为Observable或Observable、android.databinding.ObservableList的实例源码、Angular2 – 在另一个Observable中使用Observable返回方法的值

本文目录一览:

JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?(javafx controller)

JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?(javafx controller)

我正在尝试研究JavaFX,因为我想将其用作程序的GUI。我的问题本质上是一个概念性的问题:

到目前为止,我的程序主要是MVC模式的“模型”部分。也就是说,从类的意义上讲,几乎所有我的代码都是抽象的OO表示,而所有这些代码都是逻辑代码。

由于我不想成为程序的唯一用户,因此我想添加MVC的“视图”部分,以便人们可以轻松使用和操纵程序的“模型”部分。为此,我想使用JavaFX。

在我的“模型”类中,我显然使用了Java Collections
API中的各种List,Map和其他类。为了让程序的用户能够操纵这些底层的列表和映射,我想使用JavaFX中的Observable(List /
Map)接口。

一个具体的例子可以使情况变得清晰:

假设我有一个 MachineMonitor
类,该类每3分钟检查一次Machine的某些属性,例如连接是否仍然良好,齿轮旋转的速度等。如果满足某些不等式(例如,齿轮下降到1转/秒的速率)
MachineMonitor 触发RestartMachineEvent。

当前,我使用ArrayList < MachineMonitor >跟踪所有单独的 MachineMonitor
。现在扩展到MVC的“视图”部分,我希望用户能够操纵显示 MachineMonitor 列表的TableView,以便他们可以例如创建和删除新的
MachineMonitor 来监视各种计算机。

为了跟踪程序用户的 意图 (例如,为5号机器创建一个 MachineMonitor
,以检查齿轮的转数/秒是否低于0.5),我使用了ObservableList < MachineMonitor >作为TableView的基础列表。

链接程序的“模型”和“视图”的最简单方法是将“模型”类更改为具有ObservableList < MachineMonitor

而不是ArrayList < MachineMonitor >,但是(进入问题的主题)我觉得这很混乱,因为它混合了“模型”和“视图”代码。

天真的方法是将ObservableList < MachineMonitor >用于TableView并保留对ArrayList <
MachineMonitor >的使用。但是,根据JavaFX规范,对ObservableList < MachineMonitor

所做的更改不会影响基础列表。

鉴于此,是为了解决这一难题,以便为ObservableList <一个ChangeListener的最佳方式 MachineMonitor

该“传播”更改到ObservableList <制成 MachineMonitor >到底层“模型”的ArrayList <
MachineMonitor >?也许将其放在名为MachineMonitorController的类中?

这种临时解决方案似乎非常混乱且不理想。

我的问题是:在这种情况下,保持“模型”和“视图”之间几乎完全分离的最佳方法是什么?

答案1

小编典典

我不同意ObservableList在您的“模型”类中使用会违反MVC分离。An
ObservableList纯粹是数据表示;它是模型的一部分,而不是视图的一部分。我(和
其他人)在应用程序所有层的模型表示中使用JavaFX属性和集合。在其中的其他内容中,我指出了如何使用(或至少可以)绑定到JSF的JavaFX属性。(我应该提一下,并不是每个人都同意在服务器端使用FX属性的方法;但是,我真的看不到有任何方法可以使它们成为视图的一部分)。

另外,如果你这样做

List<MachineMonitor> myNonObservableList = ... ;ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList);myObservableList.add(new MachineMonitor());

可观察列表由不可观察列表支持,因此也会发生更改myNonObservableList。因此,您可以根据需要使用此方法。

'Observable <Observable <HttpEvent <any >>>'不可分配给'Observable <any []>'类型

'Observable >>'不可分配给'Observable '类型

如何解决''Observable <Observable <HttpEvent <any >>>''不可分配给''Observable <any []>''类型?

我想调用一个http请求,该请求必须返回一个observable,然后由 在特定时间间隔内调用进一步的方法...

请考虑这个

订户方法

 startReceivingMeasurmentLiveDataV2(httpOptions: any,deviceid:number,seriesType:string,aggregation:string,from:string,to:string,pageSize:number,revert:boolean) {
debugger;
if (this.intervalSubscription) {
  this.intervalSubscription.unsubscribe();
}

this.intervalSubscription = interval(200)
  .pipe(
    takeWhile(() => this.alive),//    switchMap(() => this.deviceService.getMeasurmentLiveUpdateCardDataV2(httpOptions,deviceid,seriesType,aggregation,from,to,pageSize,revert)),switchMap(() => this.deviceService.GetMeasurmentsV2(httpOptions,)
  .subscribe((liveUpdateChartData: any[]) => {

  debugger;
    this.liveUpdateChartData = [...liveUpdateChartData];

// console.log(“测量数据”); // console.log(this.liveUpdateChartData); }); }

可观察的

GetMeasurmentsV2(httpOptions: any,deviceid: number,seriesType: string,aggregationType: string,dateFrom: string,dateto: string,pageSize: number,revert: boolean):  Observable<any[]>  {
let url =  `${this.config.apiUrl}/measurement/measurements/series?aggregationType=''${aggregationType}''&dateFrom=''${dateFrom}''&dateto=''${dateto}''&pageSize=''${pageSize}''&revert=''${revert}''&series=''${seriesType}''&source=''${deviceid}''`
url = url.replace(/''/g,'''');  


return this.httpClient.get<any>(

     url,httpOptions)
      
      .pipe(map(measurments => {
        return observableOf(measurments);

     
      }));

}

现在是问题所在

enter image description here

请帮助我如何解决此问题?

解决方法

您现在正在返回嵌套的可观察对象

只需返回初始可观察的return this.httpClient.get<any>(url,httpOptions),而无需将响应包装在另一个可观察的

android – Observable返回类型必须参数化为Observable或Observable

android – Observable返回类型必须参数化为Observable或Observable

我正在使用改造2.0.0-beta2并且调试版本正常工作但我在使用Proguard进行发布版本时遇到以下错误.

这是更新的logcat错误.

11-17 18:23:22.751 16274-16274/ph.reggis.FEDT D/AndroidRuntime: Shutting down VM
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime: FATAL EXCEPTION: main
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime: Process: ph.reggis.FEDT,PID: 16274
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {ph.reggis.FEDT/ph.reggis.FEDT.view.activity.NotificationListActivity}: java.lang.IllegalArgumentException: Unable to create call adapter for class b.a
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     for method InsularFMService.getNews
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:  Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for class b.a
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     for method InsularFMService.getNews
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.Utils.methodError(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.MethodHandler.createCallAdapter(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.MethodHandler.create(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.Retrofit.loadMethodHandler(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.Retrofit$1.invoke(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at java.lang.reflect.Proxy.invoke(Proxy.java:393)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at $Proxy0.getNews(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at ph.reggis.FEDT.b.C.d(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at ph.reggis.FEDT.view.fragment.NotificationListFragment.t(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at ph.reggis.FEDT.view.fragment.NotificationListFragment.l(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v4.b.B.a(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v4.b.B.a(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v4.b.B.a(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v4.b.B.i(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v4.b.y.i(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v4.b.t.onPostResume(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.support.v7.a.B.onPostResume(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.Activity.performResume(Activity.java:6336)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:  Caused by: java.lang.IllegalStateException: Observable return type must be parameterized as ObservableNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.Retrofit.nextCallAdapter(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:     at retrofit.Retrofit.callAdapter(UnkNown Source)
11-17 18:23:22.752 16274-16274/ph.reggis.FEDT E/AndroidRuntime:         ... 28 more

接口:

@GET("news")
Observable

分段:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(Constant.WS_URL_BASE)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

InsularFMService fmService = retrofit.create(InsularFMService.class);

//Observable

Graddle:

compile "com.squareup.retrofit:retrofit:2.0.0-beta2"
compile "com.squareup.retrofit:converter-gson:2.0.0-beta2"
compile "com.squareup.retrofit:adapter-rxjava:2.0.0-beta2"

Proguard的:

# Fixed: Caused by: java.lang.NoSuchFieldException: No field producerIndex
 -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
     long producerIndex;
     long consumerIndex;
 }
 -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
     long producerNode;
     long consumerNode;
}
最佳答案
现在它正在将这些属性放在Proguard中.

# Application classes that will be serialized/deserialized over Gson
-keep class ph.reggis.FEDT.model.api.** { *; }

这是完整的设置

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default,so configure it to keep all of it.
-keepattributes Signature
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class ph.reggis.FEDT.model.api.** { *; }

##---------------End: proguard configuration for Gson  ----------

android.databinding.ObservableList的实例源码

android.databinding.ObservableList的实例源码

项目:ui-atoms-android    文件:AtomListView.java   
public void setupSelectionCallback(){
    try {
        if (removeSelectionCallback != null) {
            removeSelectionCallback.close();
        }

        if(selectedItems!=null) {
            selectedItems.addOnListChangedCallback(selectionCallback);

            ObservableList old = selectedItems;

            removeSelectionCallback = new ClosableAction(() -> {
                old.removeOnListChangedCallback(selectionCallback);
            });
        }else{
            removeSelectionCallback = null;
        }

    }catch (Exception ex){
        ex.printstacktrace();
    }
}
项目:spline    文件:Layerlistadapter.java   
public ObservableList<Layer> getTwirledDownLayersForGroup(LayerGroup root) {
    ObservableList<Layer> twirledDownLayers = new ObservableArrayList<>();

    for (Layer l : root.getLayers()) {
        twirledDownLayers.add(l);
        if (l instanceof LayerGroup) {
            LayerGroup group = (LayerGroup) l;
            if (group.isTwirledDown()) {
                int i = twirledDownLayers.indexOf(l);
                List<Layer> childLayers = getTwirledDownLayersForGroup(group);
                twirledDownLayers.addAll(i + 1,childLayers);
            }
        }
    }

    return twirledDownLayers;
}
项目:recycler-binding    文件:RecyclerViewExtensions.java   
@BindingAdapter({
        "bind:items","bind:itemLayout","bind:itembindingId","bind:spanCount","bind:layoutType","bind:orientation"})
public static void createAdapterStaggeredGrid(final RecyclerView list,ObservableList items,int itemLayout,int itembindingId,int spanCount,@LayoutManagerType.LayoutType int layoutType,int orientation) {
    if (null == list.getAdapter()) {
        SimpleBindinglistadapter adapter = new SimpleBindinglistadapter(items,itembindingId,itemLayout);
        RecyclerView.LayoutManager layoutManager = createLayoutManager(list,spanCount,layoutType,orientation);
        list.setLayoutManager(layoutManager);
        list.setAdapter(adapter);
    }
}
项目:filtered-observable-collection    文件:FilteredReadOnlyObservableListTest.java   
@Test
@SuppressWarnings("unchecked")
public void multipleReplaceButFilteredAll() {
    FilteredReadOnlyObservableList<String> list
            = new FilteredReadOnlyObservableList<>(rule.getSource(),new Filter<String>() {
        @Override
        public boolean execute(String element) {
            return !element.contains("2") && !element.contains("3");
        }
    });
    rule.setUpList(list);

    rule.getSource().setAll(1,Arrays.asList("element2-2","element3-2"));

    verify(rule.getCallback(),never())
            .onItemRangeChanged((ObservableList) any(),anyInt(),anyInt());
    assertthat(list.size(),is(3));
}
项目:android-ui-toolkit-demos    文件:ListBindingAdapters.java   
@Override
public void onItemRangeInserted(ObservableList observableList,int start,int count) {
    if (mLayoutId == 0) {
        return;
    }
    startTransition(mTarget);
    final int end = start + count;
    LayoutInflater inflater = (LayoutInflater) mTarget.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    for (int i = end - 1; i >= start; i--) {
        Object entry = observableList.get(i);
        ViewDataBinding binding =
                bindLayout(inflater,mTarget,mLayoutId,entry);
        mTarget.addView(binding.getRoot(),start);
    }
}
项目:filtered-observable-collection    文件:FilteredReadOnlyObservableListTest.java   
@Test
@SuppressWarnings("unchecked")
public void moveButFilteredAll() {
    FilteredReadOnlyObservableList<String> list
            = new FilteredReadOnlyObservableList<>(rule.getSource(),new Filter<String>() {
        @Override
        public boolean execute(String element) {
            return !element.contains("2") && !element.contains("3");
        }
    });
    rule.setUpList(list);

    rule.getSource().move(1,2);

    verify(rule.getCallback(),never())
            .onItemRangeRemoved((ObservableList) any(),anyInt());
    verify(rule.getCallback(),never())
            .onItemRangeInserted((ObservableList) any(),anyInt());
    assertthat(list.get(0),is("element1"));
    assertthat(list.get(1),is("element4"));
}
项目:Cinder    文件:CinderUnitTest.java   
@Test
public void computableListElementsAreComputable() throws Exception {

    String string1 = "STRING 1";
    String string2 = "STRING 2";
    StringClass stringClass = new StringClass(string1);

    ObservableList<StringClass> strings = new ObservableArrayList<>();
    strings.add(0,stringClass);
    ObservableField<String> computedString = Cinder.computeField(()->strings.get(0).element.get(),Cinder.observable(strings,StringClass.class,"element")).immediate();
    assertEquals(computedString.get(),string1);

    strings.get(0).element.set(string2);
    assertEquals(computedString.get(),string2);
}
项目:Cook-E    文件:ObservableArrayListTest.java   
/**
     * Checks whether the ObservableArrayList notifies its callbacks when an iterator is used
     * to remove items
     *
     * This test is temporarily disabled because of an Android bug.
     * A bug report has been filed: https://code.google.com/p/android/issues/detail?id=201481
     */
//    @Test
    public void testRemoveWithIterator() {
        final ObservableList<String> items = new ObservableArrayList<>();

        final ListChangeMock<String> mock = new ListChangeMock<>();
        items.addOnListChangedCallback(mock);

        // Add items to list
        items.addAll(Arrays.asList("Cake","Pie","galette","Pudding"));
        // Change listener reflects the added items
        assertEquals(items,mock.getCurrentList());

        // Remove all items from the list using an iterator
        for (Iterator<String> iter = items.iterator(); iter.hasNext(); ) {
            iter.next();
            iter.remove();
        }
        // List is Now empty
        assertTrue(items.isEmpty());
        // Change listener should reflect this
        assertEquals(items,mock.getCurrentList());
    }
项目:filtered-observable-collection    文件:FilteredReadOnlyObservableListTest.java   
@Test
@SuppressWarnings("unchecked")
public void remove() {
    FilteredReadOnlyObservableList<ObservableItem> list
            = new FilteredReadOnlyObservableList<>(rule.getSource());
    rule.setUpList(list);

    ObservableItem willBeRemoved = rule.getSource().get(0);
    rule.getSource().remove(new ObservableItem("element1"));

    verify(rule.getCallback()).onItemRangeRemoved(list,1);
    assertthat(list.get(0).getValue(),is("element2"));

    willBeRemoved.setValue("element1-changed");

    verify(rule.getCallback(),anyInt());
}
项目:filtered-observable-collection    文件:FilteredReadOnlyObservableListTest.java   
@Test
@SuppressWarnings("unchecked")
public void multipleRemoveButFilteredAll() {
    FilteredReadOnlyObservableList<String> list
            = new FilteredReadOnlyObservableList<>(rule.getSource(),new Filter<String>() {
        @Override
        public boolean execute(String element) {
            return !element.equals("element2") && !element.equals("element3");
        }
    });
    rule.setUpList(list);

    rule.getSource().removeRange(1,3);

    verify(rule.getCallback(),is(3));
}
项目:ui-atoms-android    文件:AtomListView.java   
@BindingAdapter("selectedItems")
public static <T> void setSelectedItems(
        AtomListView view,@Nullable ObservableList<T> list){
    if(view.getSelectedItems() == list)
        return;
    view.setSelectedItems(list);
}
项目:ui-atoms-android    文件:AtomListView.java   
@BindingAdapter("items")
public static <T> void adapterSetItems(AtomListView view,ObservableList<T> items){
    if(view.getItems() == items)
        return;
    view.setItems(items);
    if(view.getLayoutManager() == null){
        linearlayoutmanager linearlayoutmanager =
                new linearlayoutmanager(view.getContext(),linearlayoutmanager.VERTICAL,false);
        view.setLayoutManager(linearlayoutmanager);
    }
}
项目:spline    文件:DocumentView.java   
private void addPropertyChangedCallbacks(List<Layer> layers,int end) {
    for (int i = start; i < end; i++) {
        Layer l = layers.get(i);
        l.addOnPropertyChangedCallback(mOnPropertyChangedCallback);
        if (l instanceof LayerGroup) {
            LayerGroup lg = (LayerGroup) l;
            ObservableList<Layer> childLayers = lg.getLayers();
            // Add list listener for future changes to the layer group's list of children
            childLayers.addOnListChangedCallback(mOnListChangedCallback);

            // Recursive call to add property listeners to each child layer
            addPropertyChangedCallbacks(childLayers);
        }
    }
}
项目:spline    文件:ListFragment.java   
private void updateList() {
    Pickerviewmodel viewmodel = Pickerviewmodel.getInstance();
    ObservableList<File> files = viewmodel.getFiles();

    if (mAdapter == null) {
        mAdapter = new FileAdapter();
        mList.setAdapter(mAdapter);
    }

    mAdapter.setFiles(files);
    mBinding.setviewmodel(viewmodel);
}
项目:spline    文件:ListFragment.java   
public FileAdapter() {
    mOnListChangedCallback = new ObservableList
            .OnListChangedCallback<ObservableList<Layer>>() {
        @Override
        public void onChanged(ObservableList<Layer> layers) {

        }

        @Override
        public void onItemRangeChanged(ObservableList<Layer> layers,int i,int i1) {

        }

        @Override
        public void onItemRangeInserted(ObservableList<Layer> layers,int
                count) {
            notifyItemRangeInserted(start,count);
        }

        @Override
        public void onItemRangeMoved(ObservableList<Layer> sender,int fromPosition,int
                toPosition,int itemCount) {

        }

        @Override
        public void onItemRangeRemoved(ObservableList<Layer> sender,int positionStart,int itemCount) {

        }
    };
}
项目:spline    文件:Layerlistadapter.java   
private void addListChangedCallbacks(List<Layer> layers,int end) {
    for (int i = start; i < end; i++) {
        Layer l = layers.get(i);
        if (l instanceof LayerGroup) {
            LayerGroup lg = (LayerGroup) l;
            ObservableList<Layer> childLayers = lg.getLayers();
            // Add list listener for future changes to the layer group's list of children
            childLayers.addOnListChangedCallback(mOnListChangedCallback);
            // Recursive call to add property listeners to each child layer
            addListChangedCallbacks(childLayers);
        }
    }
}
项目:Mvvm    文件:MvvmAdapter.java   
public final void setItems(@Nullable List<T> items) {
    if (items == this.items) {
        return;
    }
    this.items = items;
    if (null == recyclerView) {
        if (this.items instanceof ObservableList) {
            removeObservableListCallback();
        }
        if (items instanceof ObservableList) {
            addobservableListCallback();
        }
    }
    notifyDataSetChanged();
}
项目:Mvvm    文件:MvvmAdapter.java   
private void addobservableListCallback() {
    if (null == this.items) {
        return;
    }
    callback = new ObservableListChangedCallback<>(this,(ObservableList<T>) items);
    ((ObservableList<T>) this.items).addOnListChangedCallback(callback);
}
项目:Mvvm    文件:MvvmAdapter.java   
private void removeObservableListCallback() {
    if (null == this.items) {
        return;
    }
    ((ObservableList<T>) this.items).removeOnListChangedCallback(callback);
    callback = null;
}
项目:Mvvm    文件:MvvmAdapter.java   
@Override
public void onChanged(ObservableList<T> sender) {
    MvvmAdapter<T> adapter = getAdapter();
    if (null == adapter) {
        return;
    }
    adapter.notifyDataSetChanged();
}
项目:Mvvm    文件:MvvmAdapter.java   
@Override
public void onItemRangeChanged(ObservableList<T> sender,int itemCount) {
    MvvmAdapter<T> adapter = getAdapter();
    if (null == adapter) {
        return;
    }
    adapter.notifyDataSetChanged();
}
项目:Mvvm    文件:MvvmAdapter.java   
@Override
public void onItemRangeInserted(ObservableList<T> sender,int itemCount) {
    MvvmAdapter<T> adapter = getAdapter();
    if (null == adapter) {
        return;
    }
    adapter.notifyDataSetChanged();
    adapter.notifyItemRangeChanged(positionStart,itemCount);
}
项目:Mvvm    文件:MvvmAdapter.java   
@Override
public void onItemRangeMoved(ObservableList<T> sender,int toPosition,int itemCount) {
    MvvmAdapter<T> adapter = getAdapter();
    if (null == adapter) {
        return;
    }
    for (int i = 0; i < itemCount; i++) {
        adapter.notifyItemmoved(fromPosition + i,toPosition + i);
    }
}
项目:Mvvm    文件:MvvmAdapter.java   
@Override
public void onItemRangeRemoved(ObservableList<T> sender,int itemCount) {
    MvvmAdapter<T> adapter = getAdapter();
    if (null == adapter) {
        return;
    }
    adapter.notifyDataSetChanged();
    adapter.notifyItemRangeRemoved(positionStart,itemCount);
}
项目:Mvvm    文件:MvvmAdapter.java   
static <T,A extends MvvmAdapter<T>> AdapterWRef<T,A> createRef(A adapter,ObservableList<T> items,ObservableList.OnListChangedCallback<ObservableList<T>> callback) {
    if (thread == null || !thread.isAlive()) {
        thread = new PollReferenceThread();
        thread.start();
    }
    return new AdapterWRef<>(adapter,items,callback);
}
项目:RxDataBinding    文件:ObservableArrayListItemRangeChangeEventObservable.java   
Listener(final ObservableArrayList<T> observableArrayList,final Observer<? super ObservableArrayListItemRangeChangeEvent<T>> observer) {
  this.observableArrayList = observableArrayList;
  this.onListChangedCallback =
      new ObservableList.OnListChangedCallback<ObservableArrayList<T>>() {
        @Override public void onChanged(ObservableArrayList<T> observableArrayList) {
        }

        @Override
        public void onItemRangeChanged(ObservableArrayList<T> observableArrayList,int itemCount) {
          observer.onNext(
              ObservableArrayListItemRangeChangeEvent.create(observableArrayList,positionStart,itemCount));
        }

        @Override
        public void onItemRangeInserted(ObservableArrayList<T> observableArrayList,int itemCount) {
        }

        @Override
        public void onItemRangeMoved(ObservableArrayList<T> observableArrayList,int positionEnd,int itemCount) {
        }

        @Override
        public void onItemRangeRemoved(ObservableArrayList<T> observableArrayList,int itemCount) {
        }
      };
}
项目:RxDataBinding    文件:ObservableArrayListItemRangeInsertionEventObservable.java   
Listener(final ObservableArrayList<T> observableArrayList,final Observer<? super ObservableArrayListItemRangeInsertionEvent<T>> observer) {
  this.observableArrayList = observableArrayList;
  this.onListChangedCallback =
      new ObservableList.OnListChangedCallback<ObservableArrayList<T>>() {
        @Override public void onChanged(ObservableArrayList<T> observableArrayList) {
        }

        @Override
        public void onItemRangeChanged(ObservableArrayList<T> observableArrayList,int itemCount) {
        }

        @Override
        public void onItemRangeInserted(ObservableArrayList<T> observableArrayList,int itemCount) {
          observer.onNext(ObservableArrayListItemRangeInsertionEvent.create(observableArrayList,itemCount));
        }

        @Override
        public void onItemRangeMoved(ObservableArrayList<T> observableArrayList,int itemCount) {
        }
      };
}
项目:RxDataBinding    文件:ObservableArrayListItemRangeRemovalEventObservable.java   
Listener(final ObservableArrayList<T> observableArrayList,final Observer<? super ObservableArrayListItemRangeRemovalEvent<T>> observer) {
  this.observableArrayList = observableArrayList;
  this.onListChangedCallback =
      new ObservableList.OnListChangedCallback<ObservableArrayList<T>>() {
        @Override public void onChanged(ObservableArrayList<T> observableArrayList) {
        }

        @Override
        public void onItemRangeChanged(ObservableArrayList<T> observableArrayList,int itemCount) {
          observer.onNext(ObservableArrayListItemRangeRemovalEvent.create(observableArrayList,itemCount));
        }
      };
}
项目:recycler-binding    文件:OnBindingListChangedCallback.java   
@Override
public void onChanged(ObservableList sender) {
    RecyclerView.Adapter adapter = mAdapterWeakRef.get();
    if (adapter != null) {
        adapter.notifyDataSetChanged();
    }
}
项目:GoogleBookReader-android    文件:ObservableRecyclerViewAdapter.java   
@Override
public void onItemRangeRemoved(ObservableList sender,int itemCount) {
    RecyclerView.Adapter adapter = adapterReference.get();
    if (adapter != null) {
        adapter.notifyItemRangeRemoved(positionStart,itemCount);
    }
}
项目:recycler-binding    文件:OnBindingListChangedCallback.java   
@Override
public void onItemRangeInserted(ObservableList sender,int itemCount) {
    RecyclerView.Adapter adapter = mAdapterWeakRef.get();
    if (adapter != null) {
        adapter.notifyItemRangeInserted(positionStart,itemCount);
    }
}
项目:recycler-binding    文件:OnBindingListChangedCallback.java   
@Override
public void onItemRangeMoved(ObservableList sender,int itemCount) {
    RecyclerView.Adapter adapter = mAdapterWeakRef.get();
    if (adapter != null) {
        adapter.notifyItemmoved(fromPosition,toPosition);
    }
}
项目:recycler-binding    文件:OnBindingListChangedCallback.java   
@Override
public void onItemRangeRemoved(ObservableList sender,int itemCount) {
    RecyclerView.Adapter adapter = mAdapterWeakRef.get();
    if (adapter != null) {
        adapter.notifyItemRangeRemoved(positionStart,itemCount);
    }
}
项目:recycler-binding    文件:SimpleBindingHeaderedlistadapter.java   
public SimpleBindingHeaderedlistadapter(final ObservableList<T> items,final int bindingVariableId,final int rowLayoutResId,final Object headerModel,final int bindingVariableIdHeader,final int headerLayoutResId) {
    mItems = items;
    mBindingVariableId = bindingVariableId;
    mRowLayoutResId = rowLayoutResId;
    mHeaderModel = headerModel;
    mBindingVariableIdHeader = bindingVariableIdHeader;
    mHeaderLayoutResId = headerLayoutResId;
    OnBindingListChangedCallback callback = new OnBindingListChangedCallback(this);
    mItems.addOnListChangedCallback(new HeaderedListChangedCallbackWrapper(callback));
}
项目:recycler-binding    文件:SimpleBindinglistadapter.java   
public SimpleBindinglistadapter(final ObservableList<T> items,final int rowLayoutResId) {
    mItems = items;
    mBindingVariableId = bindingVariableId;
    mRowLayoutResId = rowLayoutResId;
    this.mOnListChangedCallback = new OnBindingListChangedCallback(this);
    mItems.addOnListChangedCallback(this.mOnListChangedCallback);
}
项目:GoogleBookReader-android    文件:ObservableRecyclerViewAdapter.java   
public void setItems(ObservableList<T> items) {

        if (this.items != items) {

            this.items.removeOnListChangedCallback(callback);
            this.items = items;
            this.items.addOnListChangedCallback(callback);
            notifyDataSetChanged();
        }
    }
项目:recycler-binding    文件:RecyclerViewExtensions.java   
@BindingAdapter({"bind:items","bind:orientation"})
public static void createAdapter(final RecyclerView list,itemLayout);
        final linearlayoutmanager layoutManager = new linearlayoutmanager(list.getContext());
        layoutManager.setorientation(orientation);
        list.setLayoutManager(layoutManager);
        list.setAdapter(adapter);
    }
}
项目:GoogleBookReader-android    文件:ObservableRecyclerViewAdapter.java   
@Override
public void onChanged(ObservableList sender) {
    RecyclerView.Adapter adapter = adapterReference.get();
    if (adapter != null) {
        adapter.notifyDataSetChanged();
    }
}
项目:GoogleBookReader-android    文件:ObservableRecyclerViewAdapter.java   
public ObservableRecyclerViewAdapter(@NonNull ObservableList<T> items,int itembindVariable) {

        this.items = items;
        this.itemLayout = itemLayout;
        this.itembindVariable = itembindVariable;

        this.callback = new WeakReferenceOnListChangedCallback<>(this);
        this.items.addOnListChangedCallback(callback);
    }
项目:filtered-observable-collection    文件:FilteredReadOnlyObservableListTest.java   
@Test
@SuppressWarnings("unchecked")
public void notMove() {
    FilteredReadOnlyObservableList<String> list
            = new FilteredReadOnlyObservableList<>(rule.getSource());
    rule.setUpList(list);

    rule.getSource().move(1,2,anyInt());
    assertthat(list.get(1),is("element2"));
}

Angular2 – 在另一个Observable中使用Observable返回方法的值

Angular2 – 在另一个Observable中使用Observable返回方法的值

问题

我不知道如何在我的http.get中使用当前返回的getUserHeaders()的Observable值.

当前错误

输入’Observable< void>‘不能分配给’Observable< Participant []>‘

预期结果

能够使用我的Observable返回方法getUserHeaders()的值作为http调用中的headers属性.虽然只返回http调用的Observable.

以前的代码

(使用getUserHeaders()返回的harcoded Headers(所以不是Observable或Promise).

getAllParticipants(): Observable<Array<Participant>> {
    return this.http.get('someUrl',{headers: this.getUserHeaders()})
           .map(response => {
               return response.json();
        });
    });
   }

目前的代码

按照Chaining RxJS Observables from http data in Angular2 with TypeScript的回答我来到flatMap方法. (注意此代码当前会抛出’当前错误’)

getUserHeaders(): Observable<Headers> {
        let headers: Headers = new Headers();

        return NativeStorage.getItem("user").map(
            data => {
                headers.append('API_KEY',data.json().apiKey);
                headers.append('DEVICE_ID',data.json().deviceid);
                return headers
            }).catch( error => {
                console.log("error");
                headers.append('API_KEY','TEST');
                headers.append('DEVICE_ID','TEST');
                return headers;
            }
        );
    }

/** retrieves ALL the participants from the database */
    getAllParticipants(): Observable<Array<Participant>> {

         return this.getUserHeaders().flatMap( data => {
            return this.http.get('someUrl',{headers: data}).map(response => {
                return response.json();
            });
        });
   }

plunkr(承诺而不是Observable)

http://plnkr.co/edit/A0tEB9EUodWQS6AnqrtH?p=info

(注意:Observable.fromPromise()在这里没有用,所以我创建了两个返回promises的方法 – 现在我想在getParticipants()的promise中使用getUserHeaders()的值,并且仍然返回promise / observable getParticipants()并没有getUserHeaders()

将您的getUserHeaders()更改为:
getUserHeaders(): Observable<any> { return Observable.of(NativeStorage.getItem("user"); }

然后在getParticipants()中构造头对象.这样你就可以保持flatMap

关于JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?javafx controller的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于'Observable >>'不可分配给'Observable '类型、android – Observable返回类型必须参数化为Observable或Observable、android.databinding.ObservableList的实例源码、Angular2 – 在另一个Observable中使用Observable返回方法的值等相关内容,可以在本站寻找。

本文标签: