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

我有这个视图模型


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);

                    }


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


慕运维8079593
浏览 261回答 1
1回答

繁花如伊

我有了MediatorLiveData想要的东西,然后使用每个onChanged清除了列表ItemList。我将MediatorLiveData值设置为ItemList的新列表,并进行观察&nbsp;private void setupViewModel() {&nbsp; &nbsp; &nbsp; &nbsp; MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class);&nbsp; &nbsp; &nbsp; &nbsp; final LiveData<List<JournalEntry>> liveItems = viewModel.getJournals();&nbsp; &nbsp; &nbsp; &nbsp; final MediatorLiveData itemListData = new MediatorLiveData<>();&nbsp; &nbsp; &nbsp; &nbsp; itemListData.addSource(liveItems, new Observer<List<JournalEntry>>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override public void onChanged(List<JournalEntry> journalEntries) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Map<Date, List<JournalEntry>> journals = toMap(journalEntries);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Date previousDate = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items.clear();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (Date date : journals.keySet()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HeaderItem header = new HeaderItem(date);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Date currentDate = header.getDate();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (previousDate == null || !DateUtil.formatDate(currentDate).equals(DateUtil.formatDate(previousDate))) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items.add(header);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (JournalEntry journal : journals.get(date)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JournalItem item = new JournalItem(journal);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items.add(item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; previousDate = item.getJournalItem().getCreatedAt();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemListData.setValue(items);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; itemListData.observe(this, new Observer<List<ListItem>>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onChanged(@Nullable List<ListItem> journalEntries) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.d(TAG, "Updating list of tasks from LiveData in ViewModel");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mAdapter.setItems(journalEntries);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java