Kelin-Hong / MVVMLight

A toolkit help to build Android MVVM Application
1.85k stars 333 forks source link

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:

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:

Messenger


simplifies the communication between ViewModel(major) or any components


Example

Messenger


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.