gpt4 book ai didi

java - 通过更改列表类型进行 Android LiveData 转换

转载 作者:行者123 更新时间:2023-11-29 02:27:58 25 4
gpt4 key购买 nike

我有这个 View 模型

public class MainViewModel extends AndroidViewModel {

// Constant for logging
private static final String TAG = MainViewModel.class.getSimpleName();

private LiveData<List<JournalEntry>> journals;

public MainViewModel(Application application) {
super(application);
AppDatabase database = AppDatabase.getInstance(this.getApplication());
Log.d(TAG, "Actively retrieving the tasks from the DataBase");
journals = database.journalDao().loadAllJournals();
}

public LiveData<List<JournalEntry>> getJournals() {
return journals;
}
}

返回 LiveData<List<JournalEntry>>我想转换实时数据以返回 LiveData<List<ListItem>>其中 ListItem 列表包含 JournalEntry 对象和 DateHeader 对象

我曾试过像这样操纵观察列表

private void setupViewModel() {
MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
viewModel.getJournals().observe(this, new Observer<List<JournalEntry>>() {
@Override
public void onChanged(@Nullable List<JournalEntry> journalEntries) {
Log.d(TAG, "Updating list of tasks from LiveData in ViewModel");

Map<Date, List<JournalEntry>> journals = toMap(journalEntries);
Date previousDate = null;
for (Date date : journals.keySet()) {
HeaderItem header = new HeaderItem(date);
Date currentDate = header.getDate();
if(previousDate==null || !DateUtil.formatDate(currentDate).equals(DateUtil.formatDate(previousDate))){
items.add(header);
}

for (JournalEntry journal : journals.get(date)) {
JournalItem item = new JournalItem(journal);
items.add(item);
previousDate = item.getJournalItem().getCreatedAt();
}
}
mAdapter.setItems(items);
}
});
}

但意识到 View 模型正在复制所有 onChange 项目,而不是仅仅更新已更改的项目。我不太确定如何使用 LiveData 转换实现此目的

提前致谢

最佳答案

我用 MediatorLiveData 得到了我想要的东西,然后在每次 onChanged 时清除我的列表 ItemList。我将 MediatorLiveData 值设置为新的 ItemList 列表,并观察它

 private void setupViewModel() {
MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
final LiveData<List<JournalEntry>> liveItems = viewModel.getJournals();
final MediatorLiveData itemListData = new MediatorLiveData<>();
itemListData.addSource(liveItems, new Observer<List<JournalEntry>>() {
@Override public void onChanged(List<JournalEntry> journalEntries) {
Map<Date, List<JournalEntry>> journals = toMap(journalEntries);
Date previousDate = null;
items.clear();
for (Date date : journals.keySet()) {
HeaderItem header = new HeaderItem(date);
Date currentDate = header.getDate();
if (previousDate == null || !DateUtil.formatDate(currentDate).equals(DateUtil.formatDate(previousDate))) {
items.add(header);
}

for (JournalEntry journal : journals.get(date)) {
JournalItem item = new JournalItem(journal);
items.add(item);
previousDate = item.getJournalItem().getCreatedAt();
}
}
itemListData.setValue(items);


}
});

itemListData.observe(this, new Observer<List<ListItem>>() {
@Override
public void onChanged(@Nullable List<ListItem> journalEntries) {
Log.d(TAG, "Updating list of tasks from LiveData in ViewModel");
mAdapter.setItems(journalEntries);
}
});


}

关于java - 通过更改列表类型进行 Android LiveData 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51169389/

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