From 4c5f5289abd9432e78dcfc8284cf910224131d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=AA=E5=87=AF=E6=9E=97?= Date: Wed, 15 Jun 2016 10:38:04 +0800 Subject: [PATCH] initial commit --- .gitignore | 28 + README.md | 327 +++++++++- build.gradle | 25 + gradle.properties | 18 + library/.gitignore | 1 + library/bintrayUpload.gradle | 81 +++ library/build.gradle | 40 ++ library/proguard-rules.pro | 17 + .../com/kelin/mvvmlight/ApplicationTest.java | 13 + library/src/main/AndroidManifest.xml | 10 + .../com/kelin/mvvmlight/base/ViewModel.java | 10 + .../edittext/ViewBindingAdapter.java | 78 +++ .../image/ViewBindingAdapter.java | 72 +++ .../listview/ViewBindingAdapter.java | 109 ++++ .../recyclerview/ViewBindingAdapter.java | 97 +++ .../scrollview/ViewBindingAdapter.java | 65 ++ .../swiperefresh/ViewBindingAdapter.java | 24 + .../view/ViewBindingAdapter.java | 62 ++ .../viewgroup/ViewBindingAdapter.java | 31 + .../viewpager/ViewBindingAdapter.java | 58 ++ .../webview/ViewBindingAdapter.java | 17 + .../kelin/mvvmlight/command/ReplyCommand.java | 67 ++ .../mvvmlight/command/ResponseCommand.java | 66 ++ .../kelin/mvvmlight/messenger/Messenger.java | 608 ++++++++++++++++++ .../kelin/mvvmlight/messenger/WeakAction.java | 74 +++ library/src/main/res/values/attrs.xml | 144 +++++ library/src/main/res/values/strings.xml | 3 + .../com/kelin/mvvmlight/ExampleUnitTest.java | 15 + sample/.gitignore | 1 + sample/build.gradle | 44 ++ sample/proguard-rules.pro | 17 + .../mvvmlight/zhihu/ApplicationTest.java | 13 + sample/src/main/AndroidManifest.xml | 28 + .../kelin/mvvmlight/zhihu/MainActivity.java | 130 ++++ .../kelin/mvvmlight/zhihu/MainViewModel.java | 45 ++ .../mvvmlight/zhihu/TopItemViewModel.java | 38 ++ .../com/kelin/mvvmlight/zhihu/ZhiHuApp.java | 31 + .../zhihu/news/NewItemViewModel.java | 54 ++ .../zhihu/news/NewsListFragment.java | 60 ++ .../mvvmlight/zhihu/news/NewsListHelper.java | 60 ++ .../mvvmlight/zhihu/news/NewsService.java | 138 ++++ .../mvvmlight/zhihu/news/NewsViewModel.java | 178 +++++ .../mvvmlight/zhihu/news/TopNewsService.java | 191 ++++++ .../zhihu/newsdetail/NewsDetailActivity.java | 45 ++ .../newsdetail/NewsDetailCssService.java | 13 + .../zhihu/newsdetail/NewsDetailService.java | 141 ++++ .../zhihu/newsdetail/NewsDetailViewModel.java | 118 ++++ .../zhihu/retrofit/ApiException.java | 21 + .../zhihu/retrofit/ApiTypeAdapterFactory.java | 59 ++ .../zhihu/retrofit/RetrofitProvider.java | 34 + .../zhihu/retrofit/ToStringConverter.java | 16 + .../zhihu/utils/AlphaForegroundColorSpan.java | 45 ++ .../mvvmlight/zhihu/utils/ViewUtils.java | 27 + .../main/res/drawable-v21/ic_menu_camera.xml | 12 + .../main/res/drawable-v21/ic_menu_gallery.xml | 9 + .../main/res/drawable-v21/ic_menu_manage.xml | 9 + .../main/res/drawable-v21/ic_menu_send.xml | 9 + .../main/res/drawable-v21/ic_menu_share.xml | 9 + .../res/drawable-v21/ic_menu_slideshow.xml | 9 + sample/src/main/res/drawable/divider.xml | 10 + sample/src/main/res/drawable/side_nav_bar.xml | 9 + sample/src/main/res/layout/activity_main.xml | 38 ++ .../main/res/layout/activity_news_detail.xml | 79 +++ .../layout/activity_news_detail_content.xml | 36 ++ sample/src/main/res/layout/app_bar_main.xml | 73 +++ sample/src/main/res/layout/content_main.xml | 16 + .../src/main/res/layout/fragment_new_list.xml | 55 ++ sample/src/main/res/layout/listitem_news.xml | 40 ++ .../main/res/layout/listitem_news_header.xml | 30 + .../res/layout/listtem_header_top_news.xml | 24 + .../src/main/res/layout/nav_header_main.xml | 34 + .../res/layout/viewpager_item_top_news.xml | 51 ++ .../main/res/menu/activity_main_drawer.xml | 15 + sample/src/main/res/menu/main.xml | 9 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes sample/src/main/res/values-v21/styles.xml | 9 + sample/src/main/res/values-w820dp/dimens.xml | 6 + sample/src/main/res/values/colors.xml | 6 + sample/src/main/res/values/dimens.xml | 9 + sample/src/main/res/values/drawables.xml | 8 + sample/src/main/res/values/strings.xml | 9 + sample/src/main/res/values/styles.xml | 42 ++ .../mvvmlight/zhihu/ExampleUnitTest.java | 15 + settings.gradle | 1 + 88 files changed, 4386 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 library/.gitignore create mode 100644 library/bintrayUpload.gradle create mode 100644 library/build.gradle create mode 100644 library/proguard-rules.pro create mode 100644 library/src/androidTest/java/com/kelin/mvvmlight/ApplicationTest.java create mode 100644 library/src/main/AndroidManifest.xml create mode 100644 library/src/main/java/com/kelin/mvvmlight/base/ViewModel.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/edittext/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/image/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/listview/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/recyclerview/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/scrollview/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/swiperefresh/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/view/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/viewgroup/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/viewpager/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/bindingadapter/webview/ViewBindingAdapter.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/command/ReplyCommand.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/command/ResponseCommand.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/messenger/Messenger.java create mode 100644 library/src/main/java/com/kelin/mvvmlight/messenger/WeakAction.java create mode 100644 library/src/main/res/values/attrs.xml create mode 100644 library/src/main/res/values/strings.xml create mode 100644 library/src/test/java/com/kelin/mvvmlight/ExampleUnitTest.java create mode 100644 sample/.gitignore create mode 100644 sample/build.gradle create mode 100644 sample/proguard-rules.pro create mode 100644 sample/src/androidTest/java/com/kelin/mvvmlight/zhihu/ApplicationTest.java create mode 100644 sample/src/main/AndroidManifest.xml create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/MainActivity.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/MainViewModel.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/TopItemViewModel.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/ZhiHuApp.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/news/NewItemViewModel.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/news/NewsListFragment.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/news/NewsListHelper.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/news/NewsService.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/news/NewsViewModel.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/news/TopNewsService.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/newsdetail/NewsDetailActivity.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/newsdetail/NewsDetailCssService.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/newsdetail/NewsDetailService.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/newsdetail/NewsDetailViewModel.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/retrofit/ApiException.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/retrofit/ApiTypeAdapterFactory.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/retrofit/RetrofitProvider.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/retrofit/ToStringConverter.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/utils/AlphaForegroundColorSpan.java create mode 100644 sample/src/main/java/com/kelin/mvvmlight/zhihu/utils/ViewUtils.java create mode 100644 sample/src/main/res/drawable-v21/ic_menu_camera.xml create mode 100644 sample/src/main/res/drawable-v21/ic_menu_gallery.xml create mode 100644 sample/src/main/res/drawable-v21/ic_menu_manage.xml create mode 100644 sample/src/main/res/drawable-v21/ic_menu_send.xml create mode 100644 sample/src/main/res/drawable-v21/ic_menu_share.xml create mode 100644 sample/src/main/res/drawable-v21/ic_menu_slideshow.xml create mode 100644 sample/src/main/res/drawable/divider.xml create mode 100644 sample/src/main/res/drawable/side_nav_bar.xml create mode 100644 sample/src/main/res/layout/activity_main.xml create mode 100644 sample/src/main/res/layout/activity_news_detail.xml create mode 100644 sample/src/main/res/layout/activity_news_detail_content.xml create mode 100644 sample/src/main/res/layout/app_bar_main.xml create mode 100644 sample/src/main/res/layout/content_main.xml create mode 100644 sample/src/main/res/layout/fragment_new_list.xml create mode 100644 sample/src/main/res/layout/listitem_news.xml create mode 100644 sample/src/main/res/layout/listitem_news_header.xml create mode 100644 sample/src/main/res/layout/listtem_header_top_news.xml create mode 100644 sample/src/main/res/layout/nav_header_main.xml create mode 100644 sample/src/main/res/layout/viewpager_item_top_news.xml create mode 100644 sample/src/main/res/menu/activity_main_drawer.xml create mode 100644 sample/src/main/res/menu/main.xml create mode 100644 sample/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sample/src/main/res/values-v21/styles.xml create mode 100644 sample/src/main/res/values-w820dp/dimens.xml create mode 100644 sample/src/main/res/values/colors.xml create mode 100644 sample/src/main/res/values/dimens.xml create mode 100644 sample/src/main/res/values/drawables.xml create mode 100644 sample/src/main/res/values/strings.xml create mode 100644 sample/src/main/res/values/styles.xml create mode 100644 sample/src/test/java/com/kelin/mvvmlight/zhihu/ExampleUnitTest.java create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0fe3258 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +release +target +build +.settings +.project +.classpath +.idea +.DS_Store +bin +gen +proguard +.pmd +*~ +*.iml +tmp +gen-external-apklibs +out +tmp +MeituanUri +coverage +build/ +.gradle/ +local.properties +gradle/ +gradlew +gradlew.bat +.gradletasknamecache +keystore diff --git a/README.md b/README.md index 1c16448..0090a69 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,325 @@ -# MVVMLight -A toolkit help to build Android MVVM Application +# MVVM Light Toolkit +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## + +```groovy + compile 'com.kelin.mvvmlight:library:0.6.0' +``` + +requires at least android gradle plugin 1.5.0. + +##Usage## +--- +###Data Binding### + + +Binding URI to the ImageView with bind:uri will make it loading bitmap from URI and render to ImageView automatically. + + ```xml + + ``` + + --- + + **Example** + + ![image.gif](http://upload-images.jianshu.io/upload_images/966283-2e13447dfd5028a1.gif?imageMogr2/auto-orient/strip) + + --- + +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. + + ```xml + 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](http://upload-images.jianshu.io/upload_images/966283-fb4ae1cdc79ff478.gif?imageMogr2/auto-orient/strip) + + --- + **Other attributes supported:** + + - *ImageView* + + ```xml + + + + + + + ``` + + - *ListView*、*ViewPager*、*RecyclerView* + + ```xml + + + + + + + + + + + + ``` + + - *ViewGroup* + + ```xml + + + + + ``` + + - *EditText* + + ```xml + + + ``` + + - *SimpleDraweeView* + + ```xml + + + ``` + + - *WebView* + + ```xml + + + ``` + + +###Command Binding### +--- + +When RecyclerView scroll to end of list,we have onLoadMoreCommand to deal with event. + + ```xml + + ``` + +In ViewModel define a ReplyCommand field to deal with this event. + + ```java + public final ReplyCommand loadMoreCommand = new ReplyCommand<>( + (count) -> { + /*count: count of list items*/ + int page=count / LIMIT +1; + loadData(page) + }); + ``` + + --- + + **Example** + + ![listview load more](http://upload-images.jianshu.io/upload_images/966283-4774960c95b4e1e5.gif?imageMogr2/auto-orient/strip) + + --- + + Deal with click event of View is more convenient: + + ```xml +