一个工具包帮助构建 Android MVVM 应用
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.
####中文文档: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
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
Other attributes supported:
ImageView
<attr name="uri" />
<attr name="request_width" format="integer" />
<attr name="request_height" format="integer" />
<attr name="placeholderImageRes" format="reference|color" />
ListView、ViewPager、RecyclerView
<attr name="itemView" />
<attr name="items" />
<attr name="adapter" />
<attr name="dropDownItemView" format="reference" />
<attr name="itemIds" format="reference" />
<attr name="itemIsEnabled" format="reference" />
<attr name="pageTitles" format="reference" />
ViewGroup
<attr name="itemView" />
<attr name="viewModels" format="reference" />
EditText
<attr name="requestFocus" format="boolean" />
SimpleDraweeView
<attr name="uri" />
WebView
<attr name="render" format="string" />
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
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
onRefreshCommand to SwipeRefreshLayout
More command binding is supported:
View
<attr name="clickCommand" format="reference" />
<attr name="onFocusChangeCommand" format="reference" />
<attr name="onTouchCommand" />
ListView、RecyclerView
<attr name="onScrollStateChangedCommand" />
<attr name="onScrollChangeCommand" />
<attr name="onLoadMoreCommand" format="reference" />
ViewPager
<attr name="onPageScrolledCommand" format="reference" />
<attr name="onPageSelectedCommand" format="reference" />
<attr name="onPageScrollStateChangedCommand" format="reference" />
EditText
<attr name="beforeTextChangedCommand" format="reference" />
<attr name="onTextChangedCommand" format="reference" />
<attr name="afterTextChangedCommand" format="reference" />
ImageView
<attr name="onSuccessCommand" format="reference" />
<attr name="onFailureCommand" format="reference" />
ScrollView、NestedScrollView
<attr name="onScrollChangeCommand" />
<attr name="onScrollChangeCommand" />
SwipeRefreshLayout
<attr name="onRefreshCommand" format="reference" />
simplifies the communication between ViewModel(major) or any components
Example
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);
}
…
暂无开放 Issues,或尚未同步最近议题。