[英]Android kotlin passing dynamic arguments/parameters to ViewModel with ViewModelFactory
[英]Dynamic parameters in viewmodel Android
如何在 Android 中重用 ViewModel 的参数? 我有一个循环查看器,其中填充了基于参数的数据库中的数据: selectedDate
。 如何在片段中重用它,以这种方式刷新回收查看器? 到目前为止,我正在使用ViewModelFactory
:
public class MyViewModelFactory implements ViewModelProvider.Factory {
private Application mApplication;
private String mParam;
public ShiftViewModelFactory(Application mApplication, String param) {
mApplication=mApplication;
mParam = param;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return (T) new MyViewModel(mParam);
}
}
我将它加载到onCreateView
中:
myViewModel = ViewModelProviders.of(this, new myViewModelFactory(selectedDate)).get(MyViewModel.class);
如何更改参数selectedDate
然后刷新数据?
这是我的视图模型
public class ShiftsViewModel extends ViewModel implements IShiftMapCallbackListener {
private MutableLiveData<List<ShiftModel>> coworkerList;
private MutableLiveData<String> messageError;
private IShiftMapCallbackListener coworkerInfoCallbackListener;
public ShiftsViewModel() {
coworkerInfoCallbackListener = this;
}
private void loadCoworkerList() {
final List<ShiftModel> tempList = new ArrayList<>();
DatabaseReference coworkerRef = FirebaseDatabase.getInstance()
.getReference(Common.MAP)
.child(Common.DATA)
.child(selectedDate);
coworkerRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot itemSnapshot : dataSnapshot.getChildren())
if (!itemSnapshot.child("Operator").getValue().equals("")) {
ShiftModel model = itemSnapshot.getValue(ShiftModel.class);
tempList.add(model);
}
coworkerInfoCallbackListener.onCoworkerInfoLoadSuccess(tempList);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
coworkerInfoCallbackListener.onCoworkerInfoLoadFailed(databaseError.getMessage());
}
});
}
public MutableLiveData<List<ShiftModel>> getCoworkerList() {
if (coworkerList == null){
coworkerList = new MutableLiveData<>();
messageError = new MutableLiveData<>();
loadCoworkerList();
}
return coworkerList;
}
public MutableLiveData<String> getMessageError() {
return messageError;
}
@Override
public void onCoworkerInfoLoadSuccess(List<ShiftModel> shiftModels) {
coworkerList.setValue(shiftModels);
}
@Override
public void onCoworkerInfoLoadFailed(String message) {
messageError.setValue(message);
}
}
我要更改的参数是selectedDate
:
DatabaseReference coworkerRef = FirebaseDatabase.getInstance()
.getReference(Common.MAP)
.child(Common.DATA)
.child(selectedDate);
然后在片段中我这样称呼它:
shiftsViewModel.getCoworkerList().observe(this, shiftModel -> {
shiftMapAdapter = new ShiftMapAdapter(ShiftsFragment.this.getContext(), shiftModel, operatorShow);
coworker_recycler.setAdapter(shiftMapAdapter);
coworker_recycler.setLayoutAnimation(layoutAnimationController);
});
那么如何将日期从“2019-11-14”更改为“2019-11-15”
您可能希望从使用工厂参数转变为使用本质上是视图 model 数据过滤器。 你必须:
private final MutableLiveData<String> filter = new MutableLiveData<>();
filterText.setValue(...)
Transformations.switchMap(
filter, (Function<String, LiveData<...>) input -> {
...
}
void setFilter(String filter) {
this.filter.setValue(filter);
}
您可以在没有 ViewModelFactory 的情况下执行此操作。只需创建 function 以在您的 ViewModel 中设置和更新 selectedDate,然后在您的视图中调用 function
class FooViewModel: ViewModel() {
var selectedDate: String = ""
fun setDate(date: String) {
selectedDate = date
}
}
传递给 ViewModel 中 variabel 的任何值都将共享给应用相同 ViewModel 的任何视图,你的酸活动和片段可以获得相同的值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.