Android Viewmodel中的动态参数

如何在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,然后刷新数据?

这是我的ViewModel

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”

itxfdnaaa 回答:Android Viewmodel中的动态参数

您可以在没有ViewModelFactory的情况下执行此操作。只需创建函数来设置和更新ViewModel中的selectedDate,然后在视图中调用该函数

class FooViewModel: ViewModel() {

    var selectedDate: String = ""

    fun setDate(date: String) {
        selectedDate = date
    }
}

任何传递给ViewModel内部variabel的值都将共享给使用相同ViewModel的任何视图,您的酸性活动和片段可以获取相同的值

,

您可能希望从使用工厂参数转变为使用实质上是视图模型数据过滤器的方法。您必须:

  1. 定义您的“过滤器”:private final MutableLiveData<String> filter = new MutableLiveData<>();
  2. 创建模型后,使用一些值初始化您的“过滤器”(可能使用您当前已经传入工厂的值:filterText.setValue(...)
  3. 通过转换定义视图模型的实时数据(输入是保存您的过滤器的原因):
Transformations.switchMap(
    filter,(Function<String,LiveData<...>) input -> {
...
}
  1. 定义一些更改过滤器的方法-每一次这样的更改都会使您获得新鲜的数据观察:
void setFilter(String filter) {
    this.filter.setValue(filter);
}
本文链接:https://www.f2er.com/3098423.html

大家都在问