Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
门心叼龙
android-mvvm-architecture
提交
6f3e2f68
A
android-mvvm-architecture
项目概览
门心叼龙
/
android-mvvm-architecture
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
android-mvvm-architecture
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
6f3e2f68
编写于
11月 08, 2017
作者:
A
AMIT SHEKHAR
提交者:
GitHub
11月 08, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #8 from Vignesh150493/master
Simple usage of Live Data
上级
bd819a33
7340305e
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
281 addition
and
166 deletion
+281
-166
app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDatabase.java
...om/mindorks/framework/mvvm/data/local/db/AppDatabase.java
+1
-1
app/src/main/java/com/mindorks/framework/mvvm/di/module/AppModule.java
...java/com/mindorks/framework/mvvm/di/module/AppModule.java
+1
-1
app/src/main/java/com/mindorks/framework/mvvm/ui/base/BaseActivity.java
...ava/com/mindorks/framework/mvvm/ui/base/BaseActivity.java
+0
-7
app/src/main/java/com/mindorks/framework/mvvm/ui/base/BaseFragment.java
...ava/com/mindorks/framework/mvvm/ui/base/BaseFragment.java
+1
-9
app/src/main/java/com/mindorks/framework/mvvm/ui/base/BaseViewModel.java
...va/com/mindorks/framework/mvvm/ui/base/BaseViewModel.java
+6
-10
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogAdapter.java
...om/mindorks/framework/mvvm/ui/feed/blogs/BlogAdapter.java
+4
-0
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogFragment.java
...m/mindorks/framework/mvvm/ui/feed/blogs/BlogFragment.java
+18
-5
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogFragmentModule.java
...orks/framework/mvvm/ui/feed/blogs/BlogFragmentModule.java
+8
-1
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogViewModel.java
.../mindorks/framework/mvvm/ui/feed/blogs/BlogViewModel.java
+23
-1
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceAdapter.java
.../framework/mvvm/ui/feed/opensource/OpenSourceAdapter.java
+4
-0
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceFragment.java
...framework/mvvm/ui/feed/opensource/OpenSourceFragment.java
+19
-10
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceFragmentModule.java
...ork/mvvm/ui/feed/opensource/OpenSourceFragmentModule.java
+7
-1
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceNavigator.java
...ramework/mvvm/ui/feed/opensource/OpenSourceNavigator.java
+0
-4
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceViewModel.java
...ramework/mvvm/ui/feed/opensource/OpenSourceViewModel.java
+23
-3
app/src/main/java/com/mindorks/framework/mvvm/ui/main/MainActivity.java
...ava/com/mindorks/framework/mvvm/ui/main/MainActivity.java
+50
-68
app/src/main/java/com/mindorks/framework/mvvm/ui/main/MainViewModel.java
...va/com/mindorks/framework/mvvm/ui/main/MainViewModel.java
+53
-36
app/src/main/java/com/mindorks/framework/mvvm/utils/BindingUtils.java
.../java/com/mindorks/framework/mvvm/utils/BindingUtils.java
+50
-0
app/src/main/res/layout/activity_main.xml
app/src/main/res/layout/activity_main.xml
+1
-1
app/src/main/res/layout/fragment_blog.xml
app/src/main/res/layout/fragment_blog.xml
+4
-2
app/src/main/res/layout/fragment_open_source.xml
app/src/main/res/layout/fragment_open_source.xml
+4
-2
build.gradle
build.gradle
+4
-4
未找到文件。
app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDatabase.java
浏览文件 @
6f3e2f68
...
...
@@ -30,7 +30,7 @@ import com.mindorks.framework.mvvm.data.model.db.User;
* Created by amitshekhar on 07/07/17.
*/
@Database
(
entities
=
{
User
.
class
,
Question
.
class
,
Option
.
class
},
version
=
1
)
@Database
(
entities
=
{
User
.
class
,
Question
.
class
,
Option
.
class
},
version
=
2
)
public
abstract
class
AppDatabase
extends
RoomDatabase
{
public
abstract
UserDao
userDao
();
...
...
app/src/main/java/com/mindorks/framework/mvvm/di/module/AppModule.java
浏览文件 @
6f3e2f68
...
...
@@ -89,7 +89,7 @@ public class AppModule {
@Provides
@Singleton
AppDatabase
provideAppDatabase
(
@DatabaseInfo
String
dbName
,
Context
context
)
{
return
Room
.
databaseBuilder
(
context
,
AppDatabase
.
class
,
dbName
)
return
Room
.
databaseBuilder
(
context
,
AppDatabase
.
class
,
dbName
)
.
fallbackToDestructiveMigration
()
.
build
();
}
...
...
app/src/main/java/com/mindorks/framework/mvvm/ui/base/BaseActivity.java
浏览文件 @
6f3e2f68
...
...
@@ -56,7 +56,6 @@ public abstract class BaseActivity<T extends ViewDataBinding, V extends BaseView
super
.
onCreate
(
savedInstanceState
);
performDependencyInjection
();
performDataBinding
();
mViewModel
.
onViewCreated
();
}
private
void
performDataBinding
()
{
...
...
@@ -84,12 +83,6 @@ public abstract class BaseActivity<T extends ViewDataBinding, V extends BaseView
checkSelfPermission
(
permission
)
==
PackageManager
.
PERMISSION_GRANTED
;
}
@Override
protected
void
onDestroy
()
{
mViewModel
.
onDestroyView
();
super
.
onDestroy
();
}
@Override
public
void
onFragmentAttached
()
{
...
...
app/src/main/java/com/mindorks/framework/mvvm/ui/base/BaseFragment.java
浏览文件 @
6f3e2f68
...
...
@@ -44,6 +44,7 @@ public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseView
public
void
onCreate
(
@Nullable
Bundle
savedInstanceState
)
{
performDependencyInjection
();
super
.
onCreate
(
savedInstanceState
);
mViewModel
=
getViewModel
();
setHasOptionsMenu
(
false
);
}
...
...
@@ -58,10 +59,8 @@ public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseView
@Override
public
void
onViewCreated
(
View
view
,
Bundle
savedInstanceState
)
{
super
.
onViewCreated
(
view
,
savedInstanceState
);
mViewModel
=
getViewModel
();
mViewDataBinding
.
setVariable
(
getBindingVariable
(),
mViewModel
);
mViewDataBinding
.
executePendingBindings
();
mViewModel
.
onViewCreated
();
}
@Override
...
...
@@ -88,13 +87,6 @@ public abstract class BaseFragment<T extends ViewDataBinding, V extends BaseView
return
mViewDataBinding
;
}
@Override
public
void
onDestroyView
()
{
mViewModel
.
onDestroyView
();
super
.
onDestroyView
();
}
public
boolean
isNetworkConnected
()
{
return
mActivity
!=
null
&&
mActivity
.
isNetworkConnected
();
}
...
...
app/src/main/java/com/mindorks/framework/mvvm/ui/base/BaseViewModel.java
浏览文件 @
6f3e2f68
...
...
@@ -41,22 +41,13 @@ public abstract class BaseViewModel<N> extends ViewModel {
SchedulerProvider
schedulerProvider
)
{
this
.
mDataManager
=
dataManager
;
this
.
mSchedulerProvider
=
schedulerProvider
;
this
.
mCompositeDisposable
=
new
CompositeDisposable
();
}
public
void
setNavigator
(
N
navigator
)
{
this
.
mNavigator
=
navigator
;
}
public
void
onViewCreated
()
{
this
.
mCompositeDisposable
=
new
CompositeDisposable
();
}
public
void
onDestroyView
()
{
mCompositeDisposable
.
dispose
();
}
public
N
getNavigator
()
{
return
mNavigator
;
}
...
...
@@ -81,4 +72,9 @@ public abstract class BaseViewModel<N> extends ViewModel {
mIsLoading
.
set
(
isLoading
);
}
@Override
protected
void
onCleared
()
{
mCompositeDisposable
.
dispose
();
super
.
onCleared
();
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogAdapter.java
浏览文件 @
6f3e2f68
...
...
@@ -95,6 +95,10 @@ public class BlogAdapter extends RecyclerView.Adapter<BaseViewHolder> {
notifyDataSetChanged
();
}
public
void
clearItems
()
{
mBlogResponseList
.
clear
();
}
public
class
BlogViewHolder
extends
BaseViewHolder
implements
BlogItemViewModel
.
BlogItemViewModelListener
{
private
ItemBlogViewBinding
mBinding
;
...
...
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogFragment.java
浏览文件 @
6f3e2f68
...
...
@@ -16,10 +16,15 @@
package
com.mindorks.framework.mvvm.ui.feed.blogs
;
import
android.arch.lifecycle.Observer
;
import
android.arch.lifecycle.ViewModelProvider
;
import
android.arch.lifecycle.ViewModelProviders
;
import
android.databinding.BindingAdapter
;
import
android.os.Bundle
;
import
android.support.annotation.Nullable
;
import
android.support.v7.widget.DefaultItemAnimator
;
import
android.support.v7.widget.LinearLayoutManager
;
import
android.support.v7.widget.RecyclerView
;
import
android.view.View
;
import
com.mindorks.framework.mvvm.BR
;
...
...
@@ -28,6 +33,7 @@ import com.mindorks.framework.mvvm.data.model.api.BlogResponse;
import
com.mindorks.framework.mvvm.databinding.FragmentBlogBinding
;
import
com.mindorks.framework.mvvm.ui.base.BaseFragment
;
import
java.util.ArrayList
;
import
java.util.List
;
import
javax.inject.Inject
;
...
...
@@ -39,7 +45,7 @@ import javax.inject.Inject;
public
class
BlogFragment
extends
BaseFragment
<
FragmentBlogBinding
,
BlogViewModel
>
implements
BlogNavigator
,
BlogAdapter
.
BlogAdapterListener
{
@Inject
BlogViewModel
mBlogViewModel
;
ViewModelProvider
.
Factory
mViewModelFactory
;
@Inject
BlogAdapter
mBlogAdapter
;
...
...
@@ -48,6 +54,7 @@ public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewMode
LinearLayoutManager
mLayoutManager
;
FragmentBlogBinding
mFragmentBlogBinding
;
private
BlogViewModel
mBlogViewModel
;
public
static
BlogFragment
newInstance
()
{
Bundle
args
=
new
Bundle
();
...
...
@@ -63,20 +70,20 @@ public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewMode
mBlogAdapter
.
setListener
(
this
);
}
@Override
public
void
onViewCreated
(
View
view
,
@Nullable
Bundle
savedInstanceState
)
{
super
.
onViewCreated
(
view
,
savedInstanceState
);
mFragmentBlogBinding
=
getViewDataBinding
();
setUp
();
subscribeToLiveData
();
}
@Override
public
BlogViewModel
getViewModel
()
{
mBlogViewModel
=
ViewModelProviders
.
of
(
this
,
mViewModelFactory
).
get
(
BlogViewModel
.
class
);
return
mBlogViewModel
;
}
@Override
public
int
getBindingVariable
()
{
return
BR
.
viewModel
;
...
...
@@ -92,10 +99,16 @@ public class BlogFragment extends BaseFragment<FragmentBlogBinding, BlogViewMode
mFragmentBlogBinding
.
blogRecyclerView
.
setLayoutManager
(
mLayoutManager
);
mFragmentBlogBinding
.
blogRecyclerView
.
setItemAnimator
(
new
DefaultItemAnimator
());
mFragmentBlogBinding
.
blogRecyclerView
.
setAdapter
(
mBlogAdapter
);
//One method one responsibility.May be we can move fetchBlogs() outside this function.
mBlogViewModel
.
fetchBlogs
();
}
private
void
subscribeToLiveData
()
{
mBlogViewModel
.
getBlogListLiveData
().
observe
(
this
,
new
Observer
<
List
<
BlogResponse
.
Blog
>>()
{
@Override
public
void
onChanged
(
@Nullable
List
<
BlogResponse
.
Blog
>
blogs
)
{
mBlogViewModel
.
addBlogItemsToList
(
blogs
);
}
});
}
@Override
public
void
onDestroyView
()
{
super
.
onDestroyView
();
...
...
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogFragmentModule.java
浏览文件 @
6f3e2f68
...
...
@@ -16,8 +16,10 @@
package
com.mindorks.framework.mvvm.ui.feed.blogs
;
import
android.arch.lifecycle.ViewModelProvider
;
import
android.support.v7.widget.LinearLayoutManager
;
import
com.mindorks.framework.mvvm.ViewModelProviderFactory
;
import
com.mindorks.framework.mvvm.data.DataManager
;
import
com.mindorks.framework.mvvm.data.model.api.BlogResponse
;
import
com.mindorks.framework.mvvm.utils.rx.SchedulerProvider
;
...
...
@@ -34,7 +36,7 @@ import dagger.Provides;
public
class
BlogFragmentModule
{
@Provides
BlogViewModel
provideB
logViewModel
(
DataManager
dataManager
,
BlogViewModel
b
logViewModel
(
DataManager
dataManager
,
SchedulerProvider
schedulerProvider
)
{
return
new
BlogViewModel
(
dataManager
,
schedulerProvider
);
}
...
...
@@ -49,4 +51,9 @@ public class BlogFragmentModule {
return
new
LinearLayoutManager
(
fragment
.
getActivity
());
}
@Provides
ViewModelProvider
.
Factory
provideBlogViewModel
(
BlogViewModel
blogViewModel
)
{
return
new
ViewModelProviderFactory
<>(
blogViewModel
);
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/blogs/BlogViewModel.java
浏览文件 @
6f3e2f68
...
...
@@ -16,11 +16,16 @@
package
com.mindorks.framework.mvvm.ui.feed.blogs
;
import
android.arch.lifecycle.MutableLiveData
;
import
android.databinding.ObservableArrayList
;
import
com.mindorks.framework.mvvm.data.DataManager
;
import
com.mindorks.framework.mvvm.data.model.api.BlogResponse
;
import
com.mindorks.framework.mvvm.ui.base.BaseViewModel
;
import
com.mindorks.framework.mvvm.utils.rx.SchedulerProvider
;
import
java.util.List
;
import
io.reactivex.annotations.NonNull
;
import
io.reactivex.functions.Consumer
;
...
...
@@ -30,9 +35,14 @@ import io.reactivex.functions.Consumer;
public
class
BlogViewModel
extends
BaseViewModel
<
BlogNavigator
>
{
private
final
ObservableArrayList
<
BlogResponse
.
Blog
>
blogObservableArrayList
=
new
ObservableArrayList
<>();
private
final
MutableLiveData
<
List
<
BlogResponse
.
Blog
>>
blogListLiveData
;
public
BlogViewModel
(
DataManager
dataManager
,
SchedulerProvider
schedulerProvider
)
{
super
(
dataManager
,
schedulerProvider
);
blogListLiveData
=
new
MutableLiveData
<>();
fetchBlogs
();
}
public
void
fetchBlogs
()
{
...
...
@@ -46,7 +56,7 @@ public class BlogViewModel extends BaseViewModel<BlogNavigator> {
public
void
accept
(
@NonNull
BlogResponse
blogResponse
)
throws
Exception
{
if
(
blogResponse
!=
null
&&
blogResponse
.
getData
()
!=
null
)
{
getNavigator
().
updateBlog
(
blogResponse
.
getData
());
blogListLiveData
.
setValue
(
blogResponse
.
getData
());
}
setIsLoading
(
false
);
}
...
...
@@ -60,4 +70,16 @@ public class BlogViewModel extends BaseViewModel<BlogNavigator> {
}));
}
public
MutableLiveData
<
List
<
BlogResponse
.
Blog
>>
getBlogListLiveData
()
{
return
blogListLiveData
;
}
public
void
addBlogItemsToList
(
List
<
BlogResponse
.
Blog
>
blogs
)
{
blogObservableArrayList
.
clear
();
blogObservableArrayList
.
addAll
(
blogs
);
}
public
ObservableArrayList
<
BlogResponse
.
Blog
>
getBlogObservableArrayList
()
{
return
blogObservableArrayList
;
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceAdapter.java
浏览文件 @
6f3e2f68
...
...
@@ -96,6 +96,10 @@ public class OpenSourceAdapter extends RecyclerView.Adapter<BaseViewHolder> {
notifyDataSetChanged
();
}
public
void
clearItems
()
{
mOpenSourceResponseList
.
clear
();
}
public
class
OpenSourceViewHolder
extends
BaseViewHolder
implements
View
.
OnClickListener
{
private
ItemOpenSourceViewBinding
mBinding
;
...
...
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceFragment.java
浏览文件 @
6f3e2f68
...
...
@@ -17,10 +17,15 @@
package
com.mindorks.framework.mvvm.ui.feed.opensource
;
import
android.arch.lifecycle.Observer
;
import
android.arch.lifecycle.ViewModelProvider
;
import
android.arch.lifecycle.ViewModelProviders
;
import
android.databinding.BindingAdapter
;
import
android.os.Bundle
;
import
android.support.annotation.Nullable
;
import
android.support.v7.widget.DefaultItemAnimator
;
import
android.support.v7.widget.LinearLayoutManager
;
import
android.support.v7.widget.RecyclerView
;
import
android.view.View
;
import
com.mindorks.framework.mvvm.BR
;
...
...
@@ -29,6 +34,7 @@ import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
import
com.mindorks.framework.mvvm.databinding.FragmentOpenSourceBinding
;
import
com.mindorks.framework.mvvm.ui.base.BaseFragment
;
import
java.util.ArrayList
;
import
java.util.List
;
import
javax.inject.Inject
;
...
...
@@ -42,7 +48,7 @@ import dagger.android.support.AndroidSupportInjection;
public
class
OpenSourceFragment
extends
BaseFragment
<
FragmentOpenSourceBinding
,
OpenSourceViewModel
>
implements
OpenSourceNavigator
,
OpenSourceAdapter
.
OpenSourceAdapterListener
{
@Inject
OpenSourceViewModel
mOpenSourceViewModel
;
ViewModelProvider
.
Factory
mViewModelFactory
;
@Inject
OpenSourceAdapter
mOpenSourceAdapter
;
...
...
@@ -50,6 +56,7 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
@Inject
LinearLayoutManager
mLayoutManager
;
private
OpenSourceViewModel
mOpenSourceViewModel
;
FragmentOpenSourceBinding
mFragmentOpenSourceBinding
;
public
static
OpenSourceFragment
newInstance
()
{
...
...
@@ -72,10 +79,21 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
super
.
onViewCreated
(
view
,
savedInstanceState
);
mFragmentOpenSourceBinding
=
getViewDataBinding
();
setUp
();
subscribeToLiveData
();
}
private
void
subscribeToLiveData
()
{
mOpenSourceViewModel
.
getOpenSourceRepos
().
observe
(
this
,
new
Observer
<
List
<
OpenSourceItemViewModel
>>()
{
@Override
public
void
onChanged
(
@Nullable
List
<
OpenSourceItemViewModel
>
openSourceItemViewModels
)
{
mOpenSourceViewModel
.
addOpenSourceItemsToList
(
openSourceItemViewModels
);
}
});
}
@Override
public
OpenSourceViewModel
getViewModel
()
{
mOpenSourceViewModel
=
ViewModelProviders
.
of
(
this
,
mViewModelFactory
).
get
(
OpenSourceViewModel
.
class
);
return
mOpenSourceViewModel
;
}
...
...
@@ -94,8 +112,6 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
mFragmentOpenSourceBinding
.
openSourceRecyclerView
.
setLayoutManager
(
mLayoutManager
);
mFragmentOpenSourceBinding
.
openSourceRecyclerView
.
setItemAnimator
(
new
DefaultItemAnimator
());
mFragmentOpenSourceBinding
.
openSourceRecyclerView
.
setAdapter
(
mOpenSourceAdapter
);
mOpenSourceViewModel
.
fetchRepos
();
}
@Override
...
...
@@ -103,12 +119,6 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
super
.
onDestroyView
();
}
@Override
public
void
updateRepo
(
List
<
OpenSourceResponse
.
Repo
>
repoList
)
{
mOpenSourceViewModel
.
populateViewModel
(
repoList
);
mOpenSourceAdapter
.
addItems
(
mOpenSourceViewModel
.
openSourceItemViewModels
);
}
@Override
public
void
handleError
(
Throwable
throwable
)
{
// handle error
...
...
@@ -118,5 +128,4 @@ public class OpenSourceFragment extends BaseFragment<FragmentOpenSourceBinding,
public
void
onRetryClick
()
{
mOpenSourceViewModel
.
fetchRepos
();
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceFragmentModule.java
浏览文件 @
6f3e2f68
...
...
@@ -16,8 +16,10 @@
package
com.mindorks.framework.mvvm.ui.feed.opensource
;
import
android.arch.lifecycle.ViewModelProvider
;
import
android.support.v7.widget.LinearLayoutManager
;
import
com.mindorks.framework.mvvm.ViewModelProviderFactory
;
import
com.mindorks.framework.mvvm.data.DataManager
;
import
com.mindorks.framework.mvvm.utils.rx.SchedulerProvider
;
...
...
@@ -31,7 +33,7 @@ import dagger.Provides;
public
class
OpenSourceFragmentModule
{
@Provides
OpenSourceViewModel
provideO
penSourceViewModel
(
DataManager
dataManager
,
OpenSourceViewModel
o
penSourceViewModel
(
DataManager
dataManager
,
SchedulerProvider
schedulerProvider
)
{
return
new
OpenSourceViewModel
(
dataManager
,
schedulerProvider
);
}
...
...
@@ -46,4 +48,8 @@ public class OpenSourceFragmentModule {
return
new
LinearLayoutManager
(
fragment
.
getActivity
());
}
@Provides
ViewModelProvider
.
Factory
provideOpenSourceViewModel
(
OpenSourceViewModel
openSourceViewModel
)
{
return
new
ViewModelProviderFactory
<>(
openSourceViewModel
);
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceNavigator.java
浏览文件 @
6f3e2f68
...
...
@@ -26,9 +26,5 @@ import java.util.List;
public
interface
OpenSourceNavigator
{
void
updateRepo
(
List
<
OpenSourceResponse
.
Repo
>
repoList
);
void
handleError
(
Throwable
throwable
);
}
app/src/main/java/com/mindorks/framework/mvvm/ui/feed/opensource/OpenSourceViewModel.java
浏览文件 @
6f3e2f68
...
...
@@ -16,6 +16,7 @@
package
com.mindorks.framework.mvvm.ui.feed.opensource
;
import
android.arch.lifecycle.MutableLiveData
;
import
android.databinding.ObservableArrayList
;
import
com.mindorks.framework.mvvm.data.DataManager
;
...
...
@@ -23,6 +24,7 @@ import com.mindorks.framework.mvvm.data.model.api.OpenSourceResponse;
import
com.mindorks.framework.mvvm.ui.base.BaseViewModel
;
import
com.mindorks.framework.mvvm.utils.rx.SchedulerProvider
;
import
java.util.ArrayList
;
import
java.util.List
;
import
io.reactivex.annotations.NonNull
;
...
...
@@ -34,11 +36,15 @@ import io.reactivex.functions.Consumer;
public
class
OpenSourceViewModel
extends
BaseViewModel
<
OpenSourceNavigator
>
{
public
ObservableArrayList
<
OpenSourceItemViewModel
>
openSourceItemViewModels
=
new
ObservableArrayList
<>();
private
final
ObservableArrayList
<
OpenSourceItemViewModel
>
openSourceItemViewModels
=
new
ObservableArrayList
<>();
private
final
MutableLiveData
<
List
<
OpenSourceItemViewModel
>>
openSourceItemsLiveData
;
public
OpenSourceViewModel
(
DataManager
dataManager
,
SchedulerProvider
schedulerProvider
)
{
super
(
dataManager
,
schedulerProvider
);
openSourceItemsLiveData
=
new
MutableLiveData
<>();
fetchRepos
();
}
public
void
fetchRepos
()
{
...
...
@@ -52,7 +58,7 @@ public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
public
void
accept
(
@NonNull
OpenSourceResponse
openSourceResponse
)
throws
Exception
{
if
(
openSourceResponse
!=
null
&&
openSourceResponse
.
getData
()
!=
null
)
{
getNavigator
().
updateRepo
(
openSourceResponse
.
getData
(
));
openSourceItemsLiveData
.
setValue
(
getViewModelList
(
openSourceResponse
.
getData
()
));
}
setIsLoading
(
false
);
}
...
...
@@ -67,12 +73,26 @@ public class OpenSourceViewModel extends BaseViewModel<OpenSourceNavigator> {
}
public
void
populateViewModel
(
List
<
OpenSourceResponse
.
Repo
>
repoList
)
{
public
List
<
OpenSourceItemViewModel
>
getViewModelList
(
List
<
OpenSourceResponse
.
Repo
>
repoList
)
{
ArrayList
<
OpenSourceItemViewModel
>
openSourceItemViewModels
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
repoList
.
size
();
i
++)
{
openSourceItemViewModels
.
add
(
new
OpenSourceItemViewModel
(
repoList
.
get
(
i
).
getCoverImgUrl
(),
repoList
.
get
(
i
).
getTitle
(),
repoList
.
get
(
i
).
getDescription
(),
repoList
.
get
(
i
).
getProjectUrl
()));
}
return
openSourceItemViewModels
;
}
public
MutableLiveData
<
List
<
OpenSourceItemViewModel
>>
getOpenSourceRepos
()
{
return
openSourceItemsLiveData
;
}
public
void
addOpenSourceItemsToList
(
List
<
OpenSourceItemViewModel
>
openSourceItems
)
{
openSourceItemViewModels
.
clear
();
openSourceItemViewModels
.
addAll
(
openSourceItems
);
}
public
ObservableArrayList
<
OpenSourceItemViewModel
>
getOpenSourceItemViewModels
()
{
return
openSourceItemViewModels
;
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/main/MainActivity.java
浏览文件 @
6f3e2f68
...
...
@@ -16,6 +16,7 @@
package
com.mindorks.framework.mvvm.ui.main
;
import
android.arch.lifecycle.Observer
;
import
android.arch.lifecycle.ViewModelProvider
;
import
android.arch.lifecycle.ViewModelProviders
;
import
android.content.Context
;
...
...
@@ -27,6 +28,7 @@ import android.graphics.drawable.Drawable;
import
android.os.Bundle
;
import
android.os.Handler
;
import
android.support.annotation.NonNull
;
import
android.support.annotation.Nullable
;
import
android.support.design.widget.NavigationView
;
import
android.support.v4.app.Fragment
;
import
android.support.v4.app.FragmentManager
;
...
...
@@ -56,6 +58,7 @@ import com.mindorks.placeholderview.SwipePlaceHolderView;
import
com.mindorks.placeholderview.listeners.ItemRemovedListener
;
import
java.util.ArrayList
;
import
java.util.List
;
import
javax.inject.Inject
;
...
...
@@ -74,11 +77,8 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
private
MainViewModel
mMainViewModel
;
private
DrawerLayout
mDrawer
;
private
Toolbar
mToolbar
;
private
NavigationView
mNavigationView
;
private
SwipePlaceHolderView
mCardsContainerView
;
ActivityMainBinding
mActivityMainBinding
;
...
...
@@ -96,22 +96,6 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
setUp
();
}
@Override
public
void
onBackPressed
()
{
FragmentManager
fragmentManager
=
getSupportFragmentManager
();
Fragment
fragment
=
fragmentManager
.
findFragmentByTag
(
AboutFragment
.
TAG
);
if
(
fragment
==
null
)
{
super
.
onBackPressed
();
}
else
{
onFragmentDetached
(
AboutFragment
.
TAG
);
}
}
@Override
protected
void
onDestroy
()
{
super
.
onDestroy
();
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
...
...
@@ -146,6 +130,31 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
}
}
@Override
public
void
onBackPressed
()
{
FragmentManager
fragmentManager
=
getSupportFragmentManager
();
Fragment
fragment
=
fragmentManager
.
findFragmentByTag
(
AboutFragment
.
TAG
);
if
(
fragment
==
null
)
{
super
.
onBackPressed
();
}
else
{
onFragmentDetached
(
AboutFragment
.
TAG
);
}
}
public
void
onFragmentDetached
(
String
tag
)
{
FragmentManager
fragmentManager
=
getSupportFragmentManager
();
Fragment
fragment
=
fragmentManager
.
findFragmentByTag
(
tag
);
if
(
fragment
!=
null
)
{
fragmentManager
.
beginTransaction
()
.
disallowAddToBackStack
()
.
setCustomAnimations
(
R
.
anim
.
slide_left
,
R
.
anim
.
slide_right
)
.
remove
(
fragment
)
.
commitNow
();
unlockDrawer
();
}
}
private
void
setUp
()
{
mDrawer
=
mActivityMainBinding
.
drawerView
;
...
...
@@ -178,7 +187,16 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
mMainViewModel
.
updateAppVersion
(
version
);
mMainViewModel
.
onNavMenuCreated
();
setupCardContainerView
();
mMainViewModel
.
onViewInitialized
();
subscribeToLiveData
();
}
private
void
subscribeToLiveData
()
{
mMainViewModel
.
getQuestionCardData
().
observe
(
this
,
new
Observer
<
List
<
QuestionCardData
>>()
{
@Override
public
void
onChanged
(
@Nullable
List
<
QuestionCardData
>
questionCardDatas
)
{
mMainViewModel
.
setQuestionDataList
(
questionCardDatas
);
}
});
}
private
void
setupCardContainerView
()
{
...
...
@@ -205,7 +223,8 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
new
Handler
(
getMainLooper
()).
postDelayed
(
new
Runnable
()
{
@Override
public
void
run
()
{
mMainViewModel
.
onCardExhausted
();
//Reload once all the cards are removed
mMainViewModel
.
loadQuestionCards
();
}
},
800
);
}
else
{
...
...
@@ -246,62 +265,26 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
});
}
@BindingAdapter
({
"adapter"
,
"action"
})
public
static
void
setAdapter
(
SwipePlaceHolderView
mCardsContainerView
,
ArrayList
<
QuestionCardData
>
mQuestionList
,
int
mAction
)
{
if
(
mAction
==
MainViewModel
.
ACTION_ADD_ALL
)
{
if
(
mQuestionList
!=
null
)
{
mCardsContainerView
.
removeAllViews
();
for
(
QuestionCardData
question
:
mQuestionList
)
{
if
(
question
!=
null
&&
question
.
options
!=
null
&&
question
.
options
.
size
()
==
3
)
{
mCardsContainerView
.
addView
(
new
QuestionCard
(
question
));
}
}
ViewAnimationUtils
.
scaleAnimateView
(
mCardsContainerView
);
}
}
}
public
void
onFragmentDetached
(
String
tag
)
{
FragmentManager
fragmentManager
=
getSupportFragmentManager
();
Fragment
fragment
=
fragmentManager
.
findFragmentByTag
(
tag
);
if
(
fragment
!=
null
)
{
fragmentManager
.
beginTransaction
()
.
disallowAddToBackStack
()
.
setCustomAnimations
(
R
.
anim
.
slide_left
,
R
.
anim
.
slide_right
)
.
remove
(
fragment
)
.
commitNow
();
unlockDrawer
();
}
private
void
showAboutFragment
()
{
lockDrawer
();
getSupportFragmentManager
()
.
beginTransaction
()
.
disallowAddToBackStack
()
.
setCustomAnimations
(
R
.
anim
.
slide_left
,
R
.
anim
.
slide_right
)
.
add
(
R
.
id
.
clRootView
,
AboutFragment
.
newInstance
(),
AboutFragment
.
TAG
)
.
commit
();
}
p
ublic
void
lockDrawer
()
{
p
rivate
void
lockDrawer
()
{
if
(
mDrawer
!=
null
)
mDrawer
.
setDrawerLockMode
(
DrawerLayout
.
LOCK_MODE_LOCKED_CLOSED
);
}
p
ublic
void
unlockDrawer
()
{
p
rivate
void
unlockDrawer
()
{
if
(
mDrawer
!=
null
)
mDrawer
.
setDrawerLockMode
(
DrawerLayout
.
LOCK_MODE_UNLOCKED
);
}
public
void
showAboutFragment
()
{
lockDrawer
();
getSupportFragmentManager
()
.
beginTransaction
()
.
disallowAddToBackStack
()
.
setCustomAnimations
(
R
.
anim
.
slide_left
,
R
.
anim
.
slide_right
)
.
add
(
R
.
id
.
clRootView
,
AboutFragment
.
newInstance
(),
AboutFragment
.
TAG
)
.
commit
();
}
@Override
public
void
openLoginActivity
()
{
...
...
@@ -334,5 +317,4 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
public
AndroidInjector
<
Fragment
>
supportFragmentInjector
()
{
return
fragmentDispatchingAndroidInjector
;
}
}
app/src/main/java/com/mindorks/framework/mvvm/ui/main/MainViewModel.java
浏览文件 @
6f3e2f68
...
...
@@ -16,6 +16,7 @@
package
com.mindorks.framework.mvvm.ui.main
;
import
android.arch.lifecycle.MutableLiveData
;
import
android.databinding.ObservableArrayList
;
import
android.databinding.ObservableField
;
...
...
@@ -25,7 +26,6 @@ import com.mindorks.framework.mvvm.data.model.others.QuestionCardData;
import
com.mindorks.framework.mvvm.ui.base.BaseViewModel
;
import
com.mindorks.framework.mvvm.utils.rx.SchedulerProvider
;
import
java.util.ArrayList
;
import
java.util.List
;
import
io.reactivex.functions.Consumer
;
...
...
@@ -36,18 +36,23 @@ import io.reactivex.functions.Consumer;
public
class
MainViewModel
extends
BaseViewModel
<
MainNavigator
>
{
public
final
ObservableField
<
String
>
appVersion
=
new
ObservableField
<>();
public
final
ObservableField
<
String
>
userName
=
new
ObservableField
<>();
public
final
ObservableField
<
String
>
userEmail
=
new
ObservableField
<>();
public
final
ObservableField
<
String
>
userProfilePicUrl
=
new
ObservableField
<>();
public
ObservableArrayList
<
QuestionCardData
>
questionDataList
=
new
ObservableArrayList
<>();
public
int
mAction
=
NO_ACTION
;
public
static
final
int
NO_ACTION
=
-
1
,
ACTION_ADD_ALL
=
0
,
ACTION_DELETE_SINGLE
=
1
;
private
final
ObservableField
<
String
>
appVersion
=
new
ObservableField
<>();
private
final
ObservableField
<
String
>
userName
=
new
ObservableField
<>();
private
final
ObservableField
<
String
>
userEmail
=
new
ObservableField
<>();
private
final
ObservableField
<
String
>
userProfilePicUrl
=
new
ObservableField
<>();
private
final
ObservableArrayList
<
QuestionCardData
>
questionDataList
=
new
ObservableArrayList
<>();
private
final
MutableLiveData
<
List
<
QuestionCardData
>>
questionCardData
;
private
int
action
=
NO_ACTION
;
public
MainViewModel
(
DataManager
dataManager
,
SchedulerProvider
schedulerProvider
)
{
super
(
dataManager
,
schedulerProvider
);
questionCardData
=
new
MutableLiveData
<>();
loadQuestionCards
();
}
public
void
updateAppVersion
(
String
version
)
{
...
...
@@ -72,30 +77,7 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
}
}
public
void
onViewInitialized
()
{
if
(
mAction
==
NO_ACTION
)
{
getCompositeDisposable
().
add
(
getDataManager
()
.
getQuestionCardData
()
.
subscribeOn
(
getSchedulerProvider
().
io
())
.
observeOn
(
getSchedulerProvider
().
ui
())
.
subscribe
(
new
Consumer
<
List
<
QuestionCardData
>>()
{
@Override
public
void
accept
(
List
<
QuestionCardData
>
questionList
)
throws
Exception
{
if
(
questionList
!=
null
)
{
mAction
=
ACTION_ADD_ALL
;
questionDataList
.
addAll
(
questionList
);
}
}
}));
}
else
{
ArrayList
<
QuestionCardData
>
arrayList
=
(
ArrayList
<
QuestionCardData
>)
questionDataList
.
clone
();
questionDataList
.
clear
();
mAction
=
ACTION_ADD_ALL
;
questionDataList
.
addAll
(
arrayList
);
}
}
public
void
onCardExhausted
()
{
public
void
loadQuestionCards
()
{
getCompositeDisposable
().
add
(
getDataManager
()
.
getQuestionCardData
()
.
subscribeOn
(
getSchedulerProvider
().
io
())
...
...
@@ -104,14 +86,14 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
@Override
public
void
accept
(
List
<
QuestionCardData
>
questionList
)
throws
Exception
{
if
(
questionList
!=
null
)
{
mAction
=
ACTION_ADD_ALL
;
questionDataList
.
clear
();
questionDataList
.
addAll
(
questionList
);
action
=
ACTION_ADD_ALL
;
questionCardData
.
setValue
(
questionList
);
}
}
}));
}
public
void
logout
()
{
setIsLoading
(
true
);
getCompositeDisposable
().
add
(
getDataManager
().
doLogoutApiCall
()
...
...
@@ -134,7 +116,42 @@ public class MainViewModel extends BaseViewModel<MainNavigator> {
}
public
void
removeQuestionCard
()
{
mA
ction
=
ACTION_DELETE_SINGLE
;
a
ction
=
ACTION_DELETE_SINGLE
;
questionDataList
.
remove
(
0
);
questionCardData
.
getValue
().
remove
(
0
);
}
public
void
setQuestionDataList
(
List
<
QuestionCardData
>
questionCardDatas
)
{
action
=
ACTION_ADD_ALL
;
questionDataList
.
clear
();
questionDataList
.
addAll
(
questionCardDatas
);
}
public
MutableLiveData
<
List
<
QuestionCardData
>>
getQuestionCardData
()
{
return
questionCardData
;
}
public
ObservableField
<
String
>
getAppVersion
()
{
return
appVersion
;
}
public
ObservableField
<
String
>
getUserName
()
{
return
userName
;
}
public
ObservableField
<
String
>
getUserEmail
()
{
return
userEmail
;
}
public
ObservableField
<
String
>
getUserProfilePicUrl
()
{
return
userProfilePicUrl
;
}
public
ObservableArrayList
<
QuestionCardData
>
getQuestionDataList
()
{
return
questionDataList
;
}
public
int
getAction
()
{
return
action
;
}
}
app/src/main/java/com/mindorks/framework/mvvm/utils/BindingUtils.java
浏览文件 @
6f3e2f68
...
...
@@ -18,9 +18,20 @@ package com.mindorks.framework.mvvm.utils;
import
android.content.Context
;
import
android.databinding.BindingAdapter
;
import
android.support.v7.widget.RecyclerView
;
import
android.widget.ImageView
;
import
com.bumptech.glide.Glide
;
import
com.mindorks.framework.mvvm.data.model.api.BlogResponse
;
import
com.mindorks.framework.mvvm.data.model.others.QuestionCardData
;
import
com.mindorks.framework.mvvm.ui.feed.blogs.BlogAdapter
;
import
com.mindorks.framework.mvvm.ui.feed.opensource.OpenSourceAdapter
;
import
com.mindorks.framework.mvvm.ui.feed.opensource.OpenSourceItemViewModel
;
import
com.mindorks.framework.mvvm.ui.main.MainViewModel
;
import
com.mindorks.framework.mvvm.ui.main.QuestionCard
;
import
com.mindorks.placeholderview.SwipePlaceHolderView
;
import
java.util.ArrayList
;
/**
* Created by amitshekhar on 11/07/17.
...
...
@@ -37,4 +48,43 @@ public final class BindingUtils {
Context
context
=
imageView
.
getContext
();
Glide
.
with
(
context
).
load
(
url
).
into
(
imageView
);
}
@BindingAdapter
({
"adapter"
})
public
static
void
addOpenSourceItems
(
RecyclerView
recyclerView
,
ArrayList
<
OpenSourceItemViewModel
>
openSourceItems
)
{
OpenSourceAdapter
adapter
=
(
OpenSourceAdapter
)
recyclerView
.
getAdapter
();
if
(
adapter
!=
null
)
{
adapter
.
clearItems
();
adapter
.
addItems
(
openSourceItems
);
}
}
@BindingAdapter
({
"adapter"
})
public
static
void
addBlogItems
(
RecyclerView
recyclerView
,
ArrayList
<
BlogResponse
.
Blog
>
blogs
)
{
BlogAdapter
adapter
=
(
BlogAdapter
)
recyclerView
.
getAdapter
();
if
(
adapter
!=
null
)
{
adapter
.
clearItems
();
adapter
.
addItems
(
blogs
);
}
}
@BindingAdapter
({
"adapter"
,
"action"
})
public
static
void
addQuestionItems
(
SwipePlaceHolderView
mCardsContainerView
,
ArrayList
<
QuestionCardData
>
mQuestionList
,
int
mAction
)
{
if
(
mAction
==
MainViewModel
.
ACTION_ADD_ALL
)
{
if
(
mQuestionList
!=
null
)
{
mCardsContainerView
.
removeAllViews
();
for
(
QuestionCardData
question
:
mQuestionList
)
{
if
(
question
!=
null
&&
question
.
options
!=
null
&&
question
.
options
.
size
()
==
3
)
{
mCardsContainerView
.
addView
(
new
QuestionCard
(
question
));
}
}
ViewAnimationUtils
.
scaleAnimateView
(
mCardsContainerView
);
}
}
}
}
app/src/main/res/layout/activity_main.xml
浏览文件 @
6f3e2f68
...
...
@@ -77,7 +77,7 @@
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
app:adapter=
"@{viewModel.questionDataList}"
app:action=
"@{viewModel.
mA
ction}"
/>
app:action=
"@{viewModel.
a
ction}"
/>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
...
...
app/src/main/res/layout/fragment_blog.xml
浏览文件 @
6f3e2f68
...
...
@@ -14,7 +14,8 @@
~ limitations under the License
-->
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
>
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<data>
...
...
@@ -40,7 +41,8 @@
android:id=
"@+id/blogRecyclerView"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:listitem=
"@layout/item_blog_view"
/>
tools:listitem=
"@layout/item_blog_view"
app:adapter=
"@{viewModel.blogObservableArrayList}"
/>
</LinearLayout>
...
...
app/src/main/res/layout/fragment_open_source.xml
浏览文件 @
6f3e2f68
...
...
@@ -14,7 +14,8 @@
~ limitations under the License
-->
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
>
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<data>
...
...
@@ -40,7 +41,8 @@
android:id=
"@+id/openSourceRecyclerView"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:listitem=
"@layout/item_blog_view"
/>
tools:listitem=
"@layout/item_blog_view"
app:adapter=
"@{viewModel.openSourceItemViewModels}"
/>
</LinearLayout>
...
...
build.gradle
浏览文件 @
6f3e2f68
...
...
@@ -45,14 +45,14 @@ ext {
minSdkVersion
=
16
targetSdkVersion
=
26
compileSdkVersion
=
26
buildToolsVersion
=
'26.0.
0
'
buildToolsVersion
=
'26.0.
1
'
// App dependencies
supportLibraryVersion
=
'2
5.4
.0'
supportLibraryVersion
=
'2
6.1
.0'
gsonVersion
=
'2.8.0'
calligraphyVersion
=
'2.2.0'
glideVersion
=
'3.7.0'
roomDatabase
=
'1.0.0-
alpha3
'
roomDatabase
=
'1.0.0-
beta2
'
rx2FastAndroidNetworking
=
'1.0.0'
dagger2Version
=
'2.11'
...
...
@@ -61,7 +61,7 @@ ext {
placeholderviewVersion
=
'0.6.1'
debugDBVersion
=
'1.0.0'
timberVersion
=
'4.5.1'
lifecycle
=
'1.0.0-
alpha3
'
lifecycle
=
'1.0.0-
beta2
'
//Test dependencies
junitVersion
=
'4.12'
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录