搜索了android体系结构组件后,我意识到MVVM在某些方面要优于其他体系结构,因此我开始学习MVVM,并且我使用的是Kotlin语言,但问题是当我搜索教程以开始学习时,发现了很多组件,例如RxJava, RxAndroid,Dagger2,Room,Lifecycle等,但他们没有说明为什么要使用它们以及为什么要选择某些特定组件。我会给你看一些例子:
1-具有Dagger2,翻新,RxJava的Android MVVM
2-具有Dagger2,翻新,RxAndroid的Android MVVM
3-带有MVVM dagger2 RxJava Livedata和Room的Android应用
我的问题是:
1-我应该如何决定选择其中一些组件并与之一起使用?
2-我怎么知道我需要一起使用其中的一些(例如Livedata和RxJava)?
这对我来说真的很混乱,我不知道如何开始。
android design-patterns kotlin android-mvvm android-architecture-components
我的项目中有一个复杂的屏幕,我打破了多个片段.我正在尝试遵循这些类的MVVM架构,因此哪个片段有自己的ViewModelContract类.
问题是所有ViewModel都需要相同的对象实例(让我们称之为Book)来进行Room事务.
它是否有正确的方法LiveData在ViewModels之间共享数据(或)?我知道共享ViewModel的概念,但我不知道是否可以将它应用于此案例.我也想过使用,MediatorLiveData但也没有得到一个好的方法.
我正在考虑BookObservableProvider使用LiveData<Book>(或Rx Subject<Book>)一个类(让我们调用),其中每个ViewModel注入相同的实例并且加载/更新总是相同的值.
这是一个好方法吗?
我使用MVP已有很长时间了,我开始转移到MVP和MVVM之间的混合状态
详细地,我的应用程序将如下所示:
我的问题:
例如,假设我有一个项目列表,而用户长按一个项目列表,则该体系结构的哪一部分应负责检查用户是否有权执行此操作,并让他们编辑该项目或显示错误信息?
例如,假设活动下面有3个片段,而一个ViewModel可以满足这些片段
我可以使用类似:
class MainViewModel : ViewModel() , IFragmentA, IFragmentB, IFragmentC
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试在片段中获取ViewModel时,我可以编写如下内容:
lateinit var viewModel: IFragmentA
override fun onAttach(context: Context?) {
super.onAttach(context)
vm = ViewModelProviders.of(context as AppCompatActivity).get(IFragmentA::class.java)
}
Run Code Online (Sandbox Code Playgroud)
注意:我知道上面的代码不起作用,我要问的是是否有办法解决类似问题
例如,如果用户尝试删除条目,而我希望他们输入密码,则流程为:
感谢您提供任何帮助
android android-mvvm android-mvp android-architecture-components
请帮我解决我的问题。我想从我的数据库中获取 LiveData 并用 recycleview 显示它。我在 Repository 中有从数据库中获取它的方法:
fun getEthTransactions(): LiveData<List<EthTransaction>> {
return mEthTransactionsDao.getTransactions()
}
Run Code Online (Sandbox Code Playgroud)
我检查了这个方法返回的不是 null。
在 ViewModel 我这样做:
private val ethRepository: EthRepository = EthRepository(application)
val transactionData: LiveData<List<EthTransaction>>
get() = ethRepository.getEthTransactions()
Run Code Online (Sandbox Code Playgroud)
在片段中,我尝试获取 viewModel 并绑定绑定:
private val journalFragmentViewModel by lazy {
ViewModelProviders.of(this).get(JournalFragmentViewModel::class.java)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val activityJournalBinding : FragmentJournalBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_journal, container,false)
journalFragmentViewModel.transactionData.observe(this, Observer {
activityJournalBinding.viewModel = journalFragmentViewModel
JournalAdapter().journal = it
})
activityJournalBinding.viewModel = journalFragmentViewModel
activityJournalBinding.lifecycleOwner = this
return activityJournalBinding.root
}
override …Run Code Online (Sandbox Code Playgroud) android android-databinding android-mvvm android-room android-livedata
我使用android分页库实现了分页。ViewModel 返回 aLiveData<PagedList<MyObject>>并且我观察到在我设置适配器的片段中一切正常,除了当我想检查列表的大小时始终为 0。
viewModel.getSearchResults().observe(this, mList -> {
adapter.submitList(mList);
Log.e("Count", String.valueOf(mList.size()));
});
Run Code Online (Sandbox Code Playgroud)
其中 mList 是 PagedList<MyObject>
android android-mvvm android-livedata android-paging android-paging-library
我正在使用MVVM 设计模式制作用户登录屏幕,但是在实现电话号码验证逻辑时我被卡住了。我宣读了使用 mvvm 时要遵循的规则 (第 4 条规则),View 中不应包含任何逻辑,甚至不是简单的 if 条件。视图的所有逻辑都发生在 ViewModel 中。
这是我的 ViewModel 类。
public class LoginViewModel extends AndroidViewModel {
private LoginRepository loginRepository;
private HashMap<String,String> mNumberParam;
private MutableLiveData<Boolean> isValidated;
public LoginViewModel(@NonNull Application application) {
super(application);
loginRepository=LoginRepository.getInstance();
isValidated=new MutableLiveData<>();
}
public LiveData<List<OtpEnterModel.Data>> enterNumberApiHit(){
return loginRepository.enterNumberApiHit(mNumberParam);
}
public void onSubmitClick(String number){
//if mobile number not enter or wrong enter show message ,and tell the view to hide other view
if (number==null) {
Toast.makeText(getApplication(), "Invalid mobile …Run Code Online (Sandbox Code Playgroud) 我正在关注这个关于使用 MVVM 和 Retrofit 的教程
https://medium.com/@ronkan26/viewmodel-using-retrofit-mvvm-architecture-f759a0291b49
用户将 MutableLiveData 放置在 Repository 类中的位置:
public class MovieRepository {
private static final ApiInterface myInterface;
private final MutableLiveData<EntityMovieOutputs> listOfMovies = new MutableLiveData<>();
private static MovieRepository newsRepository;
public static MovieRepository getInstance(){
if (newsRepository == null){
newsRepository = new NewsRepository();
}
return movieRepository;
}
public MovieRepository(){
myInterface = RetrofitService.getInterface();
}
Run Code Online (Sandbox Code Playgroud)
I'm building a simple app and what I noticed is my repository class is quickly being filled with a lot of MutableLiveData objects. Is this actually the …
我在多个片段中有一个共享视图模型。
class MainFragment {
private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}
class MagazinesFragment {
private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}
Run Code Online (Sandbox Code Playgroud)
我在该共享视图模型中有一个事件。
class HomeActivityViewModel{
val userAuthStatusChanges = MutableLiveData<Boolean>()
}
Run Code Online (Sandbox Code Playgroud)
我正在多个片段中观察该事件。
class MainFragment {
//...
sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
// do smth
}
}
class MagazinesFragment {
//...
sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
// do smth
}
}
Run Code Online (Sandbox Code Playgroud)
每当该userAuthStatusChanges事件发生时,我想在观察该事件的所有片段中触发单个实时事件。
如果我将事件设置为 MutableLiveData,则每当重新创建片段时都会观察到该事件。如果我使用SingleLiveEvent,则该事件仅被观察到一次并且仅在一个片段中被观察到。
我希望在所有片段中触发此事件,并且每个片段中仅触发一次。我正在使用导航组件。
我有一个工作管理器,每五个小时从 roomdb 中提取一个单词并通知它
我不知道将工作管理器放在 MVVM 架构中的正确位置。我应该在 ViewModel 还是 Repository 中使用?
android mvvm android-mvvm android-architecture-components android-workmanager
当我尝试onClick在我的 Google 中设置方法时SignInButton:
android:onClick="@{() -> viewModel.onGoogleLoginClick()}"
我总是收到这个错误:
发现数据绑定错误。
****/ 数据绑定错误 ****msg: 找不到正确的 android:onClick 回调类。尝试 android.view.View 但它有 0 个抽象方法,应该有 1 个抽象方法。
文件:/Users/user/Android/project/app/src/main/res/layout/activity_login.xml loc:53:31 - 53:66 ****\ 数据绑定错误****
这是我的代码:
活动登录.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".ui.login.LoginActivity">
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.example.myapp.ui.login.LoginViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="@dimen/default_layout_padding">
<EditText
android:id="@+id/login_name_editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/login_username_hint"
android:inputType="text"
android:text="@{viewModel.mEmail}" />
<EditText
android:id="@+id/login_pass_editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/login_name_editText"
android:hint="@string/login_password_hint"
android:inputType="numberPassword"
android:text="@{viewModel.mPassword}" />
<Button
android:id="@+id/login_login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/login_pass_editText"
android:onClick="@{() -> viewModel.onServerLoginClick()}"
android:text="@string/login_login_button_text" …Run Code Online (Sandbox Code Playgroud) android ×10
android-mvvm ×10
android-architecture-components ×3
java ×2
android-mvp ×1
android-room ×1
button ×1
data-binding ×1
kotlin ×1
mvvm ×1