我正在学习用于Android编程的新体系结构组件,并且很难理解一项活动的职责。我知道他们只应该处理UI,这很有意义,但是到什么程度呢?假设我有一个活动,最初有一个EditText,用户可以在其中输入String。在此下方有一个按钮,用于添加另一个EditText供用户输入另一个String。在后台如何处理这些数据?我提出的两个解决方案如下:
1)处理ViewModel中的数据。
用户单击按钮->活动告诉ViewModel-> ViewModel维护EditTexts列表->完成操作后,活动告诉ViewModel-> ViewModel处理数据
我用这种方法看到的问题是,现在ViewModel中有UI元素,我将不得不处理某种状态(用户添加一些EditTexts,然后取消整个操作,而ViewModel必须清除其列表)
2)处理活动中的数据。
用户单击按钮->活动将维护EditText列表->完成操作后,活动将字符串列表发送到ViewModel-> ViewModel处理数据
我用这种方法看到的问题是,如果曾经替换过该视图,则视图中现在必须替换逻辑,而不是应有的“愚蠢”。
处理这种情况的首选方式是什么?
我试图在遵守 MVVM 原则并使用数据绑定的同时突出显示 recyclerview 项目。但我无法理解如何处理选择行。
我目前使用以下接口将我的 recyclerview 项目 onclick 传递到视图模型:
public interface ItemClickListener
{
void onItemClicked(String id);
}
Run Code Online (Sandbox Code Playgroud)
onclick 视图是数据绑定的:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="model"
type="Item" />
<variable
name="listener"
type="ItemClickListener" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{model.name}"
android:onClick="@{() -> listener.onItemClicked(model.name)}" />
</layout>
Run Code Online (Sandbox Code Playgroud)
视图模型实现了该接口,因此我可以引用该项目。侦听器在活动中实例化并传递到适配器中。
我将如何处理选择 recyclerview 项目(并为其指定背景颜色)?viewholder 是否应该实现 onClickListener(View view) 并将其及其位置通过我的界面传递?
android android-recyclerview android-databinding android-mvvm