gpt4 book ai didi

android - 我如何使用数据绑定(bind)和 MVVM 捕获 RecyclerView 中的点击

转载 作者:行者123 更新时间:2023-11-29 14:13:07 25 4
gpt4 key购买 nike

我有很多适配器和 View 、 View 模型等等。由于很难维护那些我想在这种情况下使用数据绑定(bind)和 mvvm。现在我尝试将项目点击转发到 View 模型中。由于它是一个回收 View ,我很乐意不放弃减少内存使用的功能。

目前我有一个设置 ViewModel 的 View ( Activity )。 ViewModel 本身有一个适配器。适配器有一个构造函数,它接收 viewModel 并将其设置到项目中。

Item 使用它来将事件发送回 ViewModel。它如何影响内存?有更好的方法吗?我以前用过 RXJava,但这看起来是同一个概念,不是吗?这是我的示例代码(已截断)。

查看

public class ScenesFragment extends BaseFragment implements Observer {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

this.scenesFragmentBinding = DataBindingUtil.inflate(inflater, R.layout.scenes_fragment, container, false);
this.scenesListViewModel = new ScenesListViewModel(getContext());
this.scenesFragmentBinding.setViewModel(this.scenesListViewModel);

View view = this.scenesFragmentBinding.getRoot();
return view;
}

}

基础布局

<layout ... >
<data><variable name="viewModel" type=".viewmodel.ScenesListViewModel"/></data>
<android.support.v7.widget.RecyclerView
app:adapter="@{viewModel.adapter}"
app:layoutManager="@{viewModel.layoutManager}" />
</layout>

View 模型

public class ScenesListViewModel extends Observable implements IViewModel {

public final SceneAdapter adapter;
private List<Scene> scenes = new ArrayList<>();

public ScenesListViewModel(@NonNull Context context) {
this.adapter = new SceneAdapter(context, scenes, this);
}

public void onRemoveClick(Scene scene) {
Timber.d("Clicked remove in the scene:" + scene);
}
}

项目布局

<layout>
<data>
<variable name="scene"type=".model.Scene"/>
<variable name="viewModel" type=".viewmodel.ScenesListViewModel"/>
</data>
<ImageButton
android:id="@+id/sceneDelete"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="15dp"
android:layout_weight="1"
android:background="@null"
android:onClick="@{() -> viewModel.onRemoveClick(scene)}"
android:src="@drawable/ic_delete_forever_white_48px"/>
</LinearLayout>
</layout>

最后是将 viewModel 设置到项目中的适配器。

适配器

public class SceneAdapter extends RecyclerView.Adapter<SceneAdapter.BindingHolder> {
private Context context;
private List<Scene> scenes;
private ScenesListViewModel scenesListViewModel;

public SceneAdapter(Context context, List<Scene> list, ScenesListViewModel scenesListViewModel) {
this.context = context;
this.scenes = list;
this.scenesListViewModel = scenesListViewModel;
}

@Override public void onBindViewHolder(SceneAdapter.BindingHolder holder, int position) {
final Scene scene = scenes.get(position);
holder.binding.setScene(scene);
holder.binding.setViewModel(scenesListViewModel);
holder.binding.executePendingBindings();
}

另一种方法是在 ViewModel 中设置一个 Listener,但这更有可能是 mvp 而不是 mvvm。我也可以再次使用 RXJava 并在适配器中创建一个主题,但我想用 android 板载工具解决它。

最佳答案

在你的 BindingHolder 子类中实现 onClickListener

class BindingHolder extends RecyclerView.ViewHolder
implements OnClickListener {
// code code code
}
@Override
public void onClick(View v) {
//code code code, use getAdapterPosition() to get the... adapter position
}
}

关于android - 我如何使用数据绑定(bind)和 MVVM 捕获 RecyclerView 中的点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com