Code Monkey home page Code Monkey logo

mvvmlight's Introduction

MVVM Light Toolkit


Android Arsenal

A toolkit help to build Android MVVM Application,We have more attributes for Data Binding of View(like Uri for ImageView) ,we create some command for deal with event( like click of Button),also have a global message pipe to communicate with other ViewModel. ##Download##

 compile 'com.kelin.mvvmlight:library:1.0.0'

requires at least android gradle plugin 1.5.0.

##Usage##

####中文文档:MVVM Light Toolkit使用指南#### ####引申阅读:如何构建Android MVVM应用程序####

###Data Binding###

Binding URI to the ImageView with bind:uri will make it loading bitmap from URI and render to ImageView automatically.

<ImageView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_alignParentRight="true"
  bind:uri="@{viewModel.imageUrl}"
  bind:placeholderImageRes="@{R.drawable.ic_launcher}"/>

Fresco.initialize(this) is require,because of loading image use Fresco default).

  public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
   }

Example

image.gif


AdapterView like ListView、RecyclerView 、ViewPager is convenient, bind it to the collection view with app:items and app:itemView,You should use an ObservableList to automatically update your view based on list changes.

 <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    bind:itemView="@{viewModel.itemView}"
    bind:items="@{viewModel.itemViewModel}"
    bind:layoutManager="@{LayoutManagers.linear()}"

In ViewModel define itemViewModel and itemView

 public final ObservableList<ViewModel> itemViewModel = new ObservableArrayList<>();
 public final ItemView itemView = ItemView.of(BR.viewModel, R.layout.layoutitem_list_view);

Adapter,ViewHolder ..is Not Required:


Example

listview_databinding.gif


Other attributes supported:

  • ImageView

    <attr name="uri" />
    <!--width for ResizeOptions (use Fresco to load bitmap). -->
    <attr name="request_width" format="integer" />
    <!--height for ResizeOptions (use Fresco to load bitmap). -->
    <attr name="request_height" format="integer" />
    <attr name="placeholderImageRes" format="reference|color" />
  • ListViewViewPagerRecyclerView

    <!-- require ItemView  or  ItemViewSelector   -->
    <attr name="itemView" />
    <!-- require List<ViewModel> bind to ItemView to presentation.-->
    <attr name="items" />
    <!-- require a adapter which type of BindingRecyclerViewAdapter<T> to AdapterView-->
    <attr name="adapter" />
    <attr name="dropDownItemView" format="reference" />
    <attr name="itemIds" format="reference" />
    <attr name="itemIsEnabled" format="reference" />
    <!-- require PageTitles<T>-->
    <attr name="pageTitles" format="reference" />
  • ViewGroup

    <!-- require ItemView  or ItemViewSelector -->
    <attr name="itemView" />
    <!-- require List<ViewModel> bind to ItemView to presentation.-->
    <attr name="viewModels" format="reference" />
  • EditText

    <!-- require boolean value to decide whether requestFocus for view. -->
    <attr name="requestFocus"  format="boolean" />
  • SimpleDraweeView

    <!-- require String to load Image"-->
    <attr name="uri" />
  • WebView

    <!-- require String render to html show in webview-->
    <attr name="render" format="string" />

###Command Binding###

When RecyclerView scroll to end of list,we have onLoadMoreCommand to deal with event.

   <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        bind:onLoadMoreCommand="@{viewModel.loadMoreCommand}"/>

In ViewModel define a ReplyCommand field to deal with this event.

   public final ReplyCommand<Integer> loadMoreCommand = new ReplyCommand<>(
      (count) -> {
          /*count: count of list items*/
           int page=count / LIMIT +1;
           loadData(page)
      });

Example

listview load more


Deal with click event of View is more convenient:

 <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            bind:clickCommand="@{viewModel.btnClickCommand}" />

In ViewModel define a ReplyCommand btnClickCommand will be call when click event occur.

 public ReplyCommand btnClickCommand = new ReplyCommand(() -> {
       do something...
    });

Example

clickCommand.gif


onRefreshCommand to SwipeRefreshLayout

refresh.gif


More command binding is supported:

  • View

    <!-- require ReplyCommand to deal with view click event. -->
    <attr name="clickCommand" format="reference" />
    <!-- require ReplyCommand<Boolean> to deal with view focus change event.
    ReplyCommand would has params which means if view hasFocus.-->
    <attr name="onFocusChangeCommand" format="reference" />
    <!-- require ReplyCommand<MotionEvent> -->
    <attr name="onTouchCommand" />
  • ListViewRecyclerView

    <!-- require ReplyCommand<Integer> -->
    <attr name="onScrollStateChangedCommand" />
    <!-- require ReplyCommand<ListViewScrollDataWrapper> -->
    <attr name="onScrollChangeCommand" />
    <!-- require ReplyCommand<Integer> count of list items-->
    <attr name="onLoadMoreCommand" format="reference" />
  • ViewPager

    <!--require ReplyCommand<ViewPagerDataWrapper> -->
    <attr name="onPageScrolledCommand" format="reference" />
    <!--require ReplyCommand<Integer> -->
    <attr name="onPageSelectedCommand" format="reference" />
    <!--require ReplyCommand<Integer> -->
    <attr name="onPageScrollStateChangedCommand" format="reference" />
  • EditText

    <!--require ReplyCommand<TextChangeDataWrapper> -->
    <attr name="beforeTextChangedCommand" format="reference" />
    <!--require ReplyCommand<TextChangeDataWrapper> -->
    <attr name="onTextChangedCommand" format="reference" />
    <!--require ReplyCommand<String> -->
    <attr name="afterTextChangedCommand" format="reference" />
  • ImageView

     <!--  require ReplyCommand<Bitmap> -->
     <attr name="onSuccessCommand" format="reference" />
     <!--require ReplyCommand<CloseableReference<CloseableImage>> -->
     <attr name="onFailureCommand" format="reference" />
  • ScrollViewNestedScrollView

    <!-- require ReplyCommand<ScrollDataWrapper> -->
    <attr name="onScrollChangeCommand" />
    <!-- require ReplyCommand<NestScrollDataWrapper> -->
    <attr name="onScrollChangeCommand" />
  • SwipeRefreshLayout

    <!-- require RelayCommand<> -->
    <attr name="onRefreshCommand" format="reference" />

###Messenger###

simplifies the communication between ViewModel(major) or any components


Example

Messenger


  • global message broadcast without deliver data

    /* TOKEN: like Action of broadcast with who register this token will be notified when event occur.*/
      Messenger.Default().sendNoMsg(TOKEN);
      /*context: it usually to be a activity ,this parameter is represent to
              a receiver which is mean for convenient when unregister message.
      TOKEN: like Action of broadcast with who register this token will be notified when event occur.
      (data)->{ }:Action to deal with event. */
      Messenger.Default().register(context, TOKEN, () -> { });
  • global message broadcast (carry data to receiver)

     Messenger.getDefault().send(data, TOKEN)
     /*context:
     TOKEN:
     Data.class: type of deliver data.
    (data)->{ }: function to deal with event which has data is deliver by sender.*/
     Messenger.getDefault().register(context, TOKEN, Data.class, (data) -> { });
  • send to specify target (inactive)

    Messenger.getDefault().sendToTarget(T message, R target)
    Messenger.getDefault().sendNoMsgToTargetWithToken(Object token,R target)
    Messenger.getDefault().sendNoMsgToTarget(Object target)
  • cancel register

     Messenger.getDefault().unregister(Object recipient)"
     /* Usually Usage*/
     @Override
     protected void onDestroy() {
             super.onDestroy();
             Messenger.getDefault().unregister(this);
      }

License

 Copyright 2016 Kelin Hong
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
    http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 

mvvmlight's People

Contributors

kelin-hong avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mvvmlight's Issues

sample can not run

the log is:
Process: com.kelin.mvvmlight.zhihu, PID: 4824
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kelin.mvvmlight.zhihu/com.kelin.mvvmlight.zhihu.MainActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class android.support.design.widget.CollapsingToolbarLayout
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340)
at android.app.ActivityThread.access$800(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class android.support.design.widget.CollapsingToolbarLayout
at android.view.LayoutInflater.createView(LayoutInflater.java:626)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:855)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:751)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:276)
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261)
at com.kelin.mvvmlight.zhihu.MainActivity.onCreate(MainActivity.java:34)
at android.app.Activity.performCreate(Activity.java:5389)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340) 
at android.app.ActivityThread.access$800(ActivityThread.java:157) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5293) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:600)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:855) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:751) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:276) 
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261) 
at com.kelin.mvvmlight.zhihu.MainActivity.onCreate(MainActivity.java:34) 
at android.app.Activity.performCreate(Activity.java:5389) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340) 
at android.app.ActivityThread.access$800(ActivityThread.java:157) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5293) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NoSuchMethodError: android.support.v4.graphics.drawable.DrawableCompat.setLayoutDirection
at android.support.design.widget.CollapsingToolbarLayout.setStatusBarScrim(CollapsingToolbarLayout.java:663)
at android.support.design.widget.CollapsingToolbarLayout.(CollapsingToolbarLayout.java:197)
at android.support.design.widget.CollapsingToolbarLayout.(CollapsingToolbarLayout.java:132)
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:855) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:751) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:276) 
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261) 
at com.kelin.mvvmlight.zhihu.MainActivity.onCreate(MainActivity.java:34) 
at android.app.Activity.performCreate(Activity.java:5389) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340) 
at android.app.ActivityThread.access$800(ActivityThread.java:157) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5293) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
at dalvik.system.NativeStart.main(Native Method) 

App crash when activity has been CG

I sometimes have the similar problem in my project(Fragment dependent with activity,but activity has been GC by system).
I have done lot of research by this issue, but can't find the best way to solve it.
Hope to discuss these issue with you,thanks a lot!

Error log:
mlight.zhihu E/AndroidRuntime: FATAL EXCEPTION: main Process: com.kelin.mvvmlight.zhihu, PID: 32108 java.lang.RuntimeException: Unable to stop activity {com.kelin.mvvmlight.zhihu/com.kelin.mvvmlight.zhihu.newsdetail.NewsDetailActivity}: rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3762) at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3819) at android.app.ActivityThread.access$1200(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1423) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5845) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) Caused by: rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements at rx.Observable$27.onError(Observable.java:8139) at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157) at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) at rx.internal.operators.OperatorDoAfterTerminate$1.onError(OperatorDoAfterTerminate.java:54) at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71) at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:131) at rx.internal.operators.OperatorTakeLastOne$ParentSubscriber.onCompleted(OperatorTakeLastOne.java:107) at rx.internal.operators.OperatorScan$2.onCompleted(OperatorScan.java:124) at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:617) at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:529) at rx.internal.operators.OperatorMerge$InnerSubscriber.onCompleted(OperatorMerge.java:818) at rx.internal.operators.OperatorMap$1.onCompleted(OperatorMap.java:43) at rx.internal.operators.OperatorFilter$1.onCompleted(OperatorFilter.java:42) at rx.internal.operators.OnSubscribeRefCount$2.onCompleted(OnSubscribeRefCount.java:129) at rx.internal.operators.OperatorPublish$PublishSubscriber.checkTerminated(OperatorPublish.java:425) at rx.internal.operators.OperatorPublish$PublishSubscriber.dispatch(OperatorPublish.java:507) at rx.internal.operators.OperatorPublish$PublishSubscriber.onCompleted(OperatorPublish.java:307) at rx.internal.operators.OperatorMaterialize$ParentSubscriber.drain(OperatorMaterialize.java:149) at rx.internal.operators.OperatorMaterialize$ParentSubscriber.onCompleted(OperatorMaterialize.java:99) at rx.observers.SerializedObserver.onCompleted(SerializedObserver.java:182) at rx.observers.SerializedSubscriber.onCompleted(SerializedSubscriber.java:65) at rx.internal.operators.OperatorTakeUntil$1.onCompleted(OperatorTakeUntil.java:57) at rx.internal.operators.OperatorTakeUntil$2.onCompleted(OperatorTakeUntil.java:72) at rx.internal.operators.OperatorTakeUntil$2.onNext(OperatorTakeUntil.java:82) at rx.internal.operators.OperatorTake$1.onNext(OperatorTake.java:76) at rx.internal.operators.OperatorFilter$1.onNext(OperatorFilter.java:54) at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onNext(OperatorOnErrorResumeNextViaFunction.java:153) at rx.internal.operators.OnSubscribeCombineLatest$LatestCoordinator.drain(OnSubscribeCombineLatest.java:285) at rx.internal.operators.OnSubscribeCombineLatest$LatestCoordinator.combine(OnSubscribeCombineLatest.java:227) at rx.internal.operators.OnSubscribeCombineLatest$CombinerSubscriber.onNext(OnSubscribeCombineLatest.java:382) at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139) at rx.internal.operators.OperatorSkip$1.onNext(OperatorSkip.java:59) at rx.internal.operators.OnSubscribeRefCount$2.onNext(OnSubscribeRefCount.java:124) at rx.internal.operators.OperatorPublish$PublishSubscriber.dispatch(OperatorPublish.java:587) at rx.internal.operators.OperatorPublish$PublishSubscriber.onNext(Opera 02-11 15:28:47.561 1205-2218/? E/ActivityManager: App crashed! Process: com.kelin.mvvmlight.zhihu

can't run it

i can't run it, error:No service of type Factory available in ProjectScopeServices.

在genymotion 4.1 运行出错

07-04 09:39:01.743 995-995/com.kelin.mvvmlight.zhihu E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add onError handling.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:60)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: rx.exceptions.OnErrorNotImplementedException
at rx.Observable$27.onError(Observable.java:8139)
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
at rx.internal.operators.OperatorToObservableList$1.onError(OperatorToObservableList.java:99)
at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)
at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:189)
at rx.internal.operators.OperatorDoOnEach$1.onNext(OperatorDoOnEach.java:82)
at rx.internal.operators.OperatorMerge$MergeSubscriber.emitScalar(OperatorMerge.java:368)
at rx.internal.operators.OperatorMerge$MergeSubscriber.tryEmit(OperatorMerge.java:330)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:807)
at rx.internal.operators.OnSubscribeFromIterable$IterableProducer.slowpath(OnSubscribeFromIterable.java:97)
at rx.internal.operators.OnSubscribeFromIterable$IterableProducer.request(OnSubscribeFromIterable.java:73)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java:49)
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java:32)
at rx.Observable.unsafeSubscribe(Observable.java:8314)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:235)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:145)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54)
at rx.internal.operators.OperatorDoOnEach$1.onNext(OperatorDoOnEach.java:85)
at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:274)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.Subscriber.setProducer(Subscriber.java:205)
at rx.Subscriber.setProducer(Subscriber.java:205)
at rx.internal.util.ScalarSynchronousObservable$2.call(ScalarSynchronousObservable.java:93)
at rx.internal.util.ScalarSynchronousObservable$2.call(ScalarSynchronousObservable.java:89)
at rx.Observable$2.call(Observable.java:162)
at rx.Observable$2.call(Observable.java:154)
at rx.Observable$2.call(Observable.java:162)
at rx.Observable$2.call(Observable.java:154)
at rx.Observable$2.call(Observable.java:162)
at rx.Observable$2.call(Observable.java:154)
at rx.Observable$2.call(Observable.java:162)
at rx.Observable$2.call(Observable.java:154)
at rx.Observable$2.call(Observable.java:162)
at rx.Observable$2.call(Observable.java:154)
at rx.Observable.subscribe(Observable.java:8407)
at rx.Observable.subscribe(Observable.java:8374)
at rx.Observable.subscribe(Observable.java:8130)
at com.kelin.mvvmlight.zhihu.MainViewModel.lambda$new$4(MainViewModel.java:41)
at com.kelin.mvvmlight.zhihu.MainViewModel.access$lambda$0(MainViewModel.java)
at com.kelin.mvvmlight.zhihu.MainViewModel$$Lambda$1.call(Unknown Source)
at com.kelin.mvvmlight.messenger.WeakAction.execute(WeakAction.java:38)
at com.kelin.mvvmlight.messenger.Messenger.sendToList(Messenger.java:309)
at com.kelin.mvvmlight.messenger.Messenger.sendToTargetOrType(Messenger.java:572)
at com.kelin.mvvmlight.messenger.Messenger.send(Messenger.java:252)
at com.kelin.mvvmlight.zhihu.news.NewsViewModel.lambda$loadTopNews$26(NewsViewModel.java:159)
at

为什么MvvmLight的minSdkVersion是15?

Error:Execution failed for task ':app:processBetaDebugManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version 15 declared in library [com.kelin.mvvmlight:library:1.0.0]

项目的minSdkVersion低于15会有什么问题?

BUG:初始化Retrofit使用RxJava2CallAdapterFactory则出现Unable to create call adapter for rx.Observable异常

  retrofit = new Retrofit.Builder()
                    .baseUrl("http://news-at.zhihu.com/")
//                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();

BUG:初始化Retrofit使用RxJava2CallAdapterFactory则出现Unable to create call adapter for rx.Observable异常。必须用RxJavaCallAdapterFactory的

Androdi Studio 3.0 编译报错

Android studio 3.0运行报错:
Error:(10, 35) 错误: 找不到符号
符号: 类 FragmentBrandGridBinding
位置: 程序包 io.itit.yixiang.databinding
Error:(6, 27) 错误: 找不到符号
符号: 类 BR
位置: 程序包 com.kelin.mvvmlight

clean项目,File > Invalidate Caches/Restart,执行后均无效.

同一个项目在Android studio 2.3下,运行正常.

希望可以出MVVM Light Toolkit2.0

由于MVVM Light Toolkit是2016年的项目了,现在RXJava,RXAndroid,Retrofit都已经到2.0版本了,API变化很大,希望MVVM Light Toolkit可以升级同时修复目前网友们发现的BUG。持续关注中...

BR

你好,BR.viewModel中的BR类找不到怎么回事

RecyclerView里面的Item使用复杂控件

你好,我在使用RecyclerView时,有部分的item需要使用复杂的控件,而这些控件无法写成在layout里面与ViewModel进行交互的形式,我考虑过使用DataBindingUtil来获取相关的Binding以获取其引用来进行操作但是,由于在RecyclerView使用

itemView.set(BR.viewModel, R.layout.listitem_home_title);

来进行绑定,因此我暂时无法获取到相应的Binding,我该如何获取到这个binding,希望你能帮我解决这个问题。
祝好!

sample里面的代码不能算MVVM吧

ViewModel不是不能引用View也不关心View的吗?那为什么NewsViewModelNewsItemViewModel会有这样的代码:

// NewsViewModel构造器
public NewsViewModel(Fragment fragment) {
        this.fragment = fragment;

        BehaviorSubject<Notification<NewsService.News>> subject = BehaviorSubject.create();
        subject.filter(Notification::isOnNext)
                .subscribe(n -> Toast.makeText(fragment.getActivity(), "load finish!", Toast.LENGTH_SHORT).show());

        Observable.just(Calendar.getInstance())
                .doOnNext(c -> c.add(Calendar.DAY_OF_MONTH, 1))
                .map(c -> NewsListHelper.DAY_FORMAT.format(c.getTime()))
                .subscribe(d -> loadTopNews(d));
    }

这里竟然弹出Toast?难道Toast不算View或者View的一部分?

// NewsItemViewModel里面的代码
//command
    public ReplyCommand itemClickCommand = new ReplyCommand(() -> {
        this.viewStyle.titleTextColor.set(context.getResources().getColor(android.R.color.darker_gray));
        Intent intent = new Intent(context, NewsDetailActivity.class);
        intent.putExtra(NewsDetailActivity.EXTRA_KEY_NEWS_ID, storiesBean.getId());
        context.startActivity(intent);
    });

startActivity,也就是跳转到新的页面不是View的工作?为什么会由ViewModel来做?

这样还算是MVVM

relaycommand 绑定错误

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.

java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:afterTextChangedCommand' with parameter type com.zhuniu.smart.library.mvvmlight.command.ReplyCommand on android.widget.EditText.
file:E:\Company\Project\zn_purchase_cloud\PCloud\app\src\main\res\layout\activity_acceptance_check_list_info.xml
loc:238:47 - 238:67
****\ data binding error ****

我是down的代码库,进行引用的。
绑定事件时出现这个错误 请问什么原因?如何解决?谢谢


当我使用网络依赖 引用 是可以使用的但是管于EditText组件的command 事件引用,没有去执行
public final ReplyCommand afterTextChangedCommand = new ReplyCommand<>(() -> {
Log.e("commond cao", "invoke");
receiptAmount.set(String.valueOf(Double.valueOf(mAcceptanceCheckListInfoModel.get().getTransactionPrice()) * Double.valueOf(mAcceptanceCheckListInfoModel.get().getActualReceivedCount())));
});

想问下什么问题?

图片加载问题

你好,在Application里面初始化了Fresco,但是ImageView无法显示图片

为什么android:layout_marginTop=“-200dp”

activity_news_detail_content.xml

<WebView
                android:id="@+id/webview"  
                android:layout_width="match_parent"  
                android:layout_height="match_parent"  
                android:layout_marginTop="-200dp"  
                app:render="@{viewModel.html}"></WebView> 

为什么android:layout_marginTop=“-200dp”

ViewGroup的绑定功能刷新逻辑和一个坑

可类似listview adapter加入ViewGroup的增量刷新逻辑
或者小幅度修改代码可适配ObserveableList add方法调用时候的增量刷新逻辑

因为Observable只是实现部分的功能(并没有实现removeAll)

//            viewModels.removeAll(moreBookContainer);
            for (ViewModel viewModel : moreBookContainer) {
                viewModels.remove(viewModel);
            }

这个在ViewGroup绑定功能的介绍里面简单提及一下会很棒

EditText的onTextChanged输入监听会受到在同一布局中的按钮点击事件的影响

在一个简单布局中一个EditText和一个Button,在EditText中绑定text和onTextChanged两个是属性,随后在对应的ViewModel的onTextChanged中对输入进行监听,输入的数字大于12时自动更改显示为12,在不绑定Button的clickCommand时,输入的限制会起作用,而在绑定Button的点击事件之后则输入限制效果没有了。求解。。。

点击详情时报错

/com.kelin.mvvmlight.zhihu E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.kelin.mvvmlight.zhihu, PID: 3460
java.lang.RuntimeException: Unable to pause activity {com.kelin.mvvmlight.zhihu/com.kelin.mvvmlight.zhihu.newsdetail.NewsDetailActivity}: rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3976)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3942)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3916)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3890)
at android.app.ActivityThread.-wrap15(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1605)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements
at rx.Observable$27.onError(Observable.java:8139)
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
at rx.internal.operators.OperatorDoAfterTerminate$1.onError(OperatorDoAfterTerminate.java:54)
at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71)
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:131)
at rx.internal.operators.OperatorTakeLastOne$ParentSubscriber.onCompleted(OperatorTakeLastOne.java:107)
at rx.internal.operators.OperatorScan$2.onCompleted(OperatorScan.java:124)
at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:617)
at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:529)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onCompleted(OperatorMerge.java:818)
at rx.internal.operators.OperatorMap$1.onCompleted(OperatorMap.java:43)
at rx.internal.operators.OperatorFilter$1.onCompleted(OperatorFilter.java:42)
at rx.internal.operators.OnSubscribeRefCount$2.onCompleted(OnSubscribeRefCount.java:129)
at rx.internal.operators.OperatorPublish$PublishSubscriber.checkTerminated(OperatorPublish.java:425)
at rx.internal.operators.OperatorPublish$PublishSubscriber.dispatch(OperatorPublish.java:507)
at rx.internal.operators.OperatorPublish$PublishSubscriber.onCompleted(OperatorPublish.java:307)
at rx.internal.operators.OperatorMaterialize$ParentSubscriber.drain(OperatorMaterialize.java:149)
at rx.internal.operators.OperatorMaterialize$ParentSubscriber.onCompleted(OperatorMaterialize.java:99)
at rx.observers.SerializedObserver.onCompleted(SerializedObserver.java:182)
at rx.observers.SerializedSubscriber.onCompleted(SerializedSubscriber.java:65)
at rx.internal.operators.OperatorTakeUntil$1.onCompleted(OperatorTakeUntil.java:57)
at rx.internal.operators.OperatorTakeUntil$2.onCompleted(OperatorTakeUntil.java:72)
at rx.internal.operators.OperatorTakeUntil$2.onNext(OperatorTakeUntil.java:82)
at rx.internal.operators.OperatorTake$1.onNext(OperatorTake.java:76)
at rx.internal.operators.OperatorFilter$1.onNext(OperatorFilter.java:54)
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onNext(OperatorOnErrorResumeNextViaFunction.java:153)
at rx.internal.operators.OnSubscribeCombineLatest$LatestCoordinator.drain(OnSubscribeCombineLatest.java:285)
at rx.internal.operators.OnSubscribeCombineLatest$LatestCoordinator.combine(OnSubscribeCombineLatest.java:227)
at rx.internal.operators.OnSubscribeCombineLatest$CombinerSubscriber.onNext(OnSubscribeCombineLatest.java:382)
at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139)
at rx.internal.operators.OperatorSkip$1.onNext(OperatorSkip.java:59)
12-27 17:25:41.006 3460-3460/com.kelin.mvvmlight.zhihu E/AndroidRuntime: at rx.internal.operators.OnSubscribeRefCount$2.onNext(OnSubscribeRefCount.java:124)
at rx.internal.operators.OperatorPublish$PublishSubscriber.dispatch(OperatorPublish.java:587)
at rx.internal.operators.OperatorPublish$PublishSubscriber.onNext(OperatorPublish.java:285)
at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150)
at rx.subjects.SubjectSubscriptionManager$SubjectObserver.emitNext(SubjectSubscriptionManager.java:253)
at rx.subjects.BehaviorSubject.onNext(BehaviorSubject.java:160)
at com.trello.rxlifecycle.components.support.RxAppCompatActivity.onPause(RxAppCompatActivity.java:65)
at android.app.Activity.performPause(Activity.java:7115)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1407)
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:3965)
... 11 more
Caused by: java.util.NoSuchElementException: Sequence contains no elements
... 48 more

这个框架怎么没有更新了

准备用mvvm开发项目,从美团的技术博客看到了这个框架,但发现已经没有更新了,是因为官方的databinding已经完善了这些功能吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.