android - 视图模型。设置数据
问题描述
我有两个片段。在卡片的第一个列表中。当您单击卡片时,会打开带有完整描述的第二个片段。我放入了安装在适配器中的捆绑标签。在第二个片段中,我得到了它,我需要按标签设置数据。
在 onChanged 方法中,我写的是 model.setVerse ((List ) data); 但什么也没发生。
起初我试图做 tvTitle.setText(data.getTitle) 但也没有发生任何事情。
视图模型
public class DataViewModel extends AndroidViewModel {
LiveData<Data> currentVerse;
public DataViewModel(@NonNull Application application, final int verseId) {
super(application);
int verseId1 = verseId;
DataRepository repository = new DataRepository(application);
currentVerse = repository.getById(verseId);
}
public LiveData<Data> getById() {
return currentVerse;
}
public void setVerse(List<Data> data) {
this.currentVerse= (LiveData<Data>) data;
}
public static class ModelFactory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final Application application;
private final int verseId;
private final DataRepository repository;
public ModelFactory(@NonNull Application application, int id) {
super();
this.application = application;
this.verseId = id;
repository = new DataRepository(application);
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass == DataViewModel.class) {
return (T) new DataViewModel(application, verseId);
}
return null;
}
}
}
分段
public class DataFragment extends Fragment {
private int verseId;
private static final String KEY_VERSE_ID = "KEY_VERSE_ID";
public TextView tvTitle;
public DataFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootViewRead = inflater.inflate(R.layout.fragment_data, container,
false);
Toolbar toolbar = rootViewRead.findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
if (activity != null) {
activity.setSupportActionBar(toolbar);
}
setHasOptionsMenu(true);
tvTitle = (TextView) rootViewRead.findViewById(R.id.text);
DataViewModel.ModelFactory factory = new DataViewModel.ModelFactory(
getActivity().getApplication(),
getArguments().getInt(KEY_VERSE_ID));
final DataViewModel model = ViewModelProviders.of(this, factory)
.get(DataViewModel.class);
model.getById().observe(this, new Observer<Data>() {
@Override
public void onChanged(Data data) {
model.setVerse((List<Data>) data);
}
});
return rootViewRead;
}
public static DataFragment forData(int verseId) {
DataFragment fragment = new DataFragment();
Bundle args = new Bundle();
args.putInt(KEY_VERSE_ID, verseId);
fragment.setArguments(args);
return fragment;
}
如有必要,我将添加 dao 和存储库类
解决方案
以下是您需要修改以设置 LiveData 的值的部分:
LiveData<<List>Data>> currentVerse;
public void setVerse(List<Data> data) {
this.currentVerse.setValue(data);
}
更多详情请点击这里
推荐阅读
- java - Java不会对抽象类的arraylist进行排序
- javascript - Json:打印某个键的值
- cassandra - 更新数据的 cassandra 压缩策略
- html - 锚到 div id 隐藏元素标题
- sql - 如何在 SQL Server 中查找非索引列的列使用统计信息?
- apache - 在 Debian Jessie i686 上安装 Varnish 4.1
- java - 在反序列化期间强制 Jackson/Gson 在属性不存在时抛出异常
- powershell - PowerShell 输出差异
- ruby-on-rails - ActiveAdmin:模型具有超过 1 个新的和编辑表单页面以及每个页面的收集操作
- javascript - 在页面中的所有现有 javascript 之前动态运行 javascript