我正在使用MutableLiveData来存储用户所做的选择.该值是从另一个活动设置的.SO onResume我正在打电话
myMutableLivedata.value = newvale
Run Code Online (Sandbox Code Playgroud)
但是除非我调用invalidateall(),否则这不会更新UI.
这是MutableLiveData的预期行为
我目前正在玩弄fragment与ViewModel和相关的生命周期的窍门LiveData。
我有 2 fragments,fragmentA和fragmentB. 我Observer在onCreate每个fragment.
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
sharedViewModel.getText().observe(this, new Observer<CharSequence>() {
@Override
public void onChanged(CharSequence charSequence) {
editText.setText(charSequence);
}
});
}
Run Code Online (Sandbox Code Playgroud)
每个fragment都有一个按钮,可以LiveData在共享中更改ViewModel
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
[...]
buttonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sharedViewModel.setText(editText.getText());
}
});
[...]
}
Run Code Online (Sandbox Code Playgroud)
SharedViewModel …
android-fragments android-livedata android-viewmodel mutablelivedata
在许多样本中,我看到:
class DataViewModel{
val data:LivaData<Int>
get() = _data
private val _data = MutableLiveData<Int>()
}
Run Code Online (Sandbox Code Playgroud)
但更简单的看起来像这样:
class DataViewModel{
val data = MutableLiveData<Int>()
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么需要这个更复杂的 2 个字段的代码构造呢?
我正在通过 udacity 关注 google android 项目“猜猜它”,他们介绍了 livedata 和 mutablelivedata。我们已经创建了一个与可变实时数据对象等效的实时数据,并为可变实时数据实例的实时数据创建了 get() 支持属性。我们使用 mutablelivedata 实例对 viewModel 中的数据进行所有更改。我们的 UI 片段在 viewModel 的 livedata 对象上设置观察者,而不是可变的 livedata 对象。
尽管观察者位于 livedata 实例而不是 mutablelivedata 实例上,但当更新 mutablelivedata 对象时,会触发 livedata 观察者代码。我喜欢它的工作原理,但我不太明白它是如何工作的。谁能向我解释一下吗?
在视图模型中
val _word = MutableLiveData<String>()
val word : LiveData<String>
get() = _word
Run Code Online (Sandbox Code Playgroud)
在 ViewModel 中编辑
private fun nextWord() {
//Select and remove a word from the list
if (wordList.isEmpty()) {
//gameFinished()
} else {
_word.value = wordList.removeAt(0)
}
}
Run Code Online (Sandbox Code Playgroud)
在 UI 片段中
viewModel.word.observe(this, Observer{newWord ->
binding.wordText.text = newWord …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以传递在 Activity 类中声明的 String 数据并将 String 数据传递给 ViewModel 类,然后将数据传递给 Fragment 类。
视图模型类
class TimeTableViewModel extends ViewModel {
private MutableLiveData<String> start_time_str = new MutableLiveData<>();
void send_StartTime(String start_Time){
start_time_str.setValue(start_Time);
}
LiveData<String> get_StartTime(){
return start_time_str;
}}
Run Code Online (Sandbox Code Playgroud)
在 ViewModel 类中,我MutableLiveData<String> start_time_str已经初始化为new MutableLiveData<>();
我想void send_StartTime(String start_Time)在 Activity 类中使用函数来设置参数的值String start_Time并调用start_time_strFragment 类。
活动课
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
case R.id.add_schedule_save:
String start_time_str = startTime.getText().toString();
Intent intent_restart0 = new Intent(TimeTable_Add_New_Schedule.this, MainActivity.class);
startActivity(intent_restart0);
TimeTableViewModel …Run Code Online (Sandbox Code Playgroud) 我的片段.kt:
viewModel.studentsTemp.observe(this, Observer {
adapter.submitList(it)
})
Run Code Online (Sandbox Code Playgroud)
MyViewModel.kt
private var _studentsTemp = MutableLiveData<MutableList<Student>>()
val studentsTemp: LiveData<MutableList<Student>> get() = _studentsTemp
init {
_studentsTemp.value = mutableListOf<Student>()
}
Run Code Online (Sandbox Code Playgroud)
仅当应用程序启动时(即创建 ViewModel 时,即当 init 块在 View Model 中运行时)才会调用 Observer。
我在片段中有一个 tablayout。选项卡布局有 3 个选项卡。哪个选项卡有一个片段。并且,在第一个片段中,我插入一个字符串并将其添加到 viewModel MutableLiveData<ArrayList>>变量中。然后,我想在第三个片段中观察。我的主要视图模型:
class MainViewModel : ViewModel() {
val message = MutableLiveData<ArrayList<String>>(arrayListOf())
fun myMessage(msg: String) {
message.value?.add(msg)
}
}
Run Code Online (Sandbox Code Playgroud)
第三片段:
class Fragment3 : Fragment() {
lateinit var model: MainViewModel
private lateinit var viewModel: MainViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view= inflater.inflate(R.layout.fragment3_fragment, container, false)
model = activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) }!!
model.message.observe(viewLifecycleOwner, Observer {
Log.e("aqui", "aqui$it")
})
return view
}
}
Run Code Online (Sandbox Code Playgroud)
我的第一个片段:
class Fragment1 : Fragment() {
lateinit var model: …Run Code Online (Sandbox Code Playgroud) android viewmodel observable android-livedata mutablelivedata
MutableList将 a 包装在LiveDataor中的建议方法是什么MutableLiveData,以便可以修改列表并观察它所发生的变化?
我在 Room 中有一些相当短的表(<20 个项目)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作其他更大表的查询中的过滤器。我的想法是将 a 分配给我的应用程序中的模型类,并通过将此类包装在或 中MutableList来使其可观察。然后,通过更新这些选择中的项目,我可以触发大型表上的必要查询。MutableLiveDataLiveData
目前我的代码具有以下结构,我已在问题中将其精简为我认为相关的内容。最终我想keyset在更复杂的查询中使用多个。我的简化模型文件如下,
class Model(application : Application) : AndroidViewModel(application)
{
val keys : LiveData<List<Key>>
val keyset : LiveData<MutableList<Key>>
val values : LiveData<List<Value>>
init {
keys = repository.keys
values = repository.values
keyset = mutableListOf<Key>() // I'm not entirely sure how to instantiate LiveData<MutableList<Key>>
}
}
Run Code Online (Sandbox Code Playgroud)
它依赖于存储库,
class Repository(private val queryset : QuerySet)
{
val keys : LiveData<List<Key>> = queryset.getKeys()
val values : …Run Code Online (Sandbox Code Playgroud) RecyclerView我的里面有ViewPager一个Fragment。此RecyclerView显示从服务器获取的数据。它通常可以工作,但我无法使用ViewModel和实现相同的功能LiveData,因为当从 更改时,该livedata.observe方法不会被调用。livedataViewModel
这是我的MonthlyOrderViewModel.java类的源代码
public class MonthlyOrderViewModel extends AndroidViewModel {
private Retrofit retrofit;
private RetrofitServices retrofitServices;
private MutableLiveData<MonthlyOrderHistory> monthlyOrderHistoryMutableLiveData = new MutableLiveData<>();
public MonthlyOrderViewModel(@NonNull Application application) {
super(application);
retrofit = RetrofitFactory.getRetrofit();
retrofitServices = retrofit.create(RetrofitServices.class);
}
public MutableLiveData<MonthlyOrderHistory> getMonthlyOrderHistoryMutableLiveData() {
return monthlyOrderHistoryMutableLiveData;
}
public void fetchMonthlyOrders() {
Call<MonthlyOrderHistory> call = retrofitServices.getAllMonthlyOrderHistory(IpharmaApplication.getInstance().getLoggedInUser().getId());
call.enqueue(new Callback<MonthlyOrderHistory>() {
@Override
public void onResponse(Call<MonthlyOrderHistory> call, Response<MonthlyOrderHistory> response) {
MonthlyOrderHistory monthlyOrderHistory = response.body(); …Run Code Online (Sandbox Code Playgroud) 我是jetpack compose的新手。我有这个值,它是一个 MutableLiveData。我希望 ofc 观察对象并获取值。我想知道是否可以以简单的方式将 MutableLiveData 转换为 MutableState ?为了使其更简单,还是最好将其保留为 MutableLiveData?