Mvvmlight

A toolkit help to build Android MVVM Application
Alternatives To Mvvmlight
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Gacui2,167
a day ago14otherC++
GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features.
Mvvmlight1,683
6 years ago14Java
A toolkit help to build Android MVVM Application
Loxodon Framework1,495714 days ago6July 11, 20221mitC#
An MVVM & Databinding framework that can use C# and Lua to develop games
Neutronium1,316385 months ago16September 11, 202092mitC#
🚀 Build .NET desktop applications using HTML, CSS and javascript.
Robobinding1,306726 years ago15June 13, 201635otherJava
A data-binding Presentation Model(MVVM) framework for the Android platform.
Mvvm_hacker_news887
6 years ago6Java
Android MVVM experiment project using the official Data Binding library
Iossampleapp666
2 months agomitSwift
Sample iOS app demonstrating Coordinators, Dependency Injection, MVVM, Binding
People Mvvm661
3 years agoJava
Sample created to practice MVVM and DataBinding in Android Applications.
Countries609
5 years ago4otherKotlin
An example Android app using Retrofit, Realm, Parceler, Dagger and the MVVM pattern with the data binding lib.
Android Mvvm437
5 years ago16apache-2.0Java
MVVM on Android using RxJava and Data Binding
Alternatives To Mvvmlight
Select To Compare


Alternative Project Comparisons
Readme

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.
 
Popular Mvvm Projects
Popular Bindings Projects
Popular Software Architecture Categories

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Java
Bindings
Mvvm
Uri
Viewmodel
Imageview
Edittext