在本文中,我们将带你了解JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?在这篇文章中,我们将为您详细介绍JavaFX中ObservableList的使用是否违反了模
在本文中,我们将带你了解JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?在这篇文章中,我们将为您详细介绍JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?的方方面面,并解答javafx controller常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的'Observable
- JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?(javafx controller)
- 'Observable
>>'不可分配给'Observable '类型 - android – Observable返回类型必须参数化为Observable或Observable
- android.databinding.ObservableList的实例源码
- Angular2 – 在另一个Observable中使用Observable返回方法的值
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分离。AnObservableList
纯粹是数据表示;它是模型的一部分,而不是视图的一部分。我(和
其他人)在应用程序所有层的模型表示中使用JavaFX属性和集合。在其中的其他内容中,我指出了如何使用(或至少可以)绑定到JSF的JavaFX属性。(我应该提一下,并不是每个人都同意在服务器端使用FX属性的方法;但是,我真的看不到有任何方法可以使它们成为视图的一部分)。
另外,如果你这样做
List<MachineMonitor> myNonObservableList = ... ;ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList);myObservableList.add(new MachineMonitor());
可观察列表由不可观察列表支持,因此也会发生更改myNonObservableList
。因此,您可以根据需要使用此方法。
'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);
}));
}
现在是问题所在
请帮助我如何解决此问题?
解决方法
您现在正在返回嵌套的可观察对象
只需返回初始可观察的return this.httpClient.get<any>(url,httpOptions)
,而无需将响应包装在另一个可观察的
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的实例源码
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(); } }
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; }
@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); } }
@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)); }
@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); } }
@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")); }
@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); }
/** * 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()); }
@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()); }
@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)); }
@BindingAdapter("selectedItems") public static <T> void setSelectedItems( AtomListView view,@Nullable ObservableList<T> list){ if(view.getSelectedItems() == list) return; view.setSelectedItems(list); }
@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); } }
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); } } }
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); }
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) { } }; }
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); } } }
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(); }
private void addobservableListCallback() { if (null == this.items) { return; } callback = new ObservableListChangedCallback<>(this,(ObservableList<T>) items); ((ObservableList<T>) this.items).addOnListChangedCallback(callback); }
private void removeObservableListCallback() { if (null == this.items) { return; } ((ObservableList<T>) this.items).removeOnListChangedCallback(callback); callback = null; }
@Override public void onChanged(ObservableList<T> sender) { MvvmAdapter<T> adapter = getAdapter(); if (null == adapter) { return; } adapter.notifyDataSetChanged(); }
@Override public void onItemRangeChanged(ObservableList<T> sender,int itemCount) { MvvmAdapter<T> adapter = getAdapter(); if (null == adapter) { return; } adapter.notifyDataSetChanged(); }
@Override public void onItemRangeInserted(ObservableList<T> sender,int itemCount) { MvvmAdapter<T> adapter = getAdapter(); if (null == adapter) { return; } adapter.notifyDataSetChanged(); adapter.notifyItemRangeChanged(positionStart,itemCount); }
@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); } }
@Override public void onItemRangeRemoved(ObservableList<T> sender,int itemCount) { MvvmAdapter<T> adapter = getAdapter(); if (null == adapter) { return; } adapter.notifyDataSetChanged(); adapter.notifyItemRangeRemoved(positionStart,itemCount); }
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); }
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) { } }; }
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) { } }; }
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)); } }; }
@Override public void onChanged(ObservableList sender) { RecyclerView.Adapter adapter = mAdapterWeakRef.get(); if (adapter != null) { adapter.notifyDataSetChanged(); } }
@Override public void onItemRangeRemoved(ObservableList sender,int itemCount) { RecyclerView.Adapter adapter = adapterReference.get(); if (adapter != null) { adapter.notifyItemRangeRemoved(positionStart,itemCount); } }
@Override public void onItemRangeInserted(ObservableList sender,int itemCount) { RecyclerView.Adapter adapter = mAdapterWeakRef.get(); if (adapter != null) { adapter.notifyItemRangeInserted(positionStart,itemCount); } }
@Override public void onItemRangeMoved(ObservableList sender,int itemCount) { RecyclerView.Adapter adapter = mAdapterWeakRef.get(); if (adapter != null) { adapter.notifyItemmoved(fromPosition,toPosition); } }
@Override public void onItemRangeRemoved(ObservableList sender,int itemCount) { RecyclerView.Adapter adapter = mAdapterWeakRef.get(); if (adapter != null) { adapter.notifyItemRangeRemoved(positionStart,itemCount); } }
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)); }
public SimpleBindinglistadapter(final ObservableList<T> items,final int rowLayoutResId) { mItems = items; mBindingVariableId = bindingVariableId; mRowLayoutResId = rowLayoutResId; this.mOnListChangedCallback = new OnBindingListChangedCallback(this); mItems.addOnListChangedCallback(this.mOnListChangedCallback); }
public void setItems(ObservableList<T> items) { if (this.items != items) { this.items.removeOnListChangedCallback(callback); this.items = items; this.items.addOnListChangedCallback(callback); notifyDataSetChanged(); } }
@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); } }
@Override public void onChanged(ObservableList sender) { RecyclerView.Adapter adapter = adapterReference.get(); if (adapter != null) { adapter.notifyDataSetChanged(); } }
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); }
@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返回方法的值
我不知道如何在我的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(): Observable<any> { return Observable.of(NativeStorage.getItem("user"); }
然后在getParticipants()中构造头对象.这样你就可以保持flatMap
关于JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?和javafx controller的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于'Observable
本文标签: