android-是否有可能使两个LiveData中的一个LiveData?

android-是否有可能使两个LiveData中的一个LiveData?,第1张

概述我有两个DAO,两个存储库和两个POJO.有什么方法可以创建两个Livedata?我需要它为Recyclerview制作一个清单.POJO是相似的对象.ExpenseRepository:public class ExpenseRepository { private ExpenseDao expenseDao; private LiveData<L

我有两个DAO,两个存储库和两个POJO.有什么方法可以创建两个livedata?我需要它为RecyclervIEw制作一个清单.
POJO是相似的对象.

ExpenseRepository:

public class ExpenseRepository {private ExpenseDao expenseDao;private liveData<List<Expense>> allExpenses;public ExpenseRepository(Application application) {    ExpenseIncomeDatabase database = ExpenseIncomeDatabase.getInstance(application);    expenseDao = database.expenseDao();    allExpenses = expenseDao.getExpensesByDay();}public liveData<List<Expense>> getAllExpensesByDay() {    return allExpenses;}

收入库:

public class IncomeRepository {private IncomeDao incomeDao;private liveData<List<Income>> allincomes;public IncomeRepository(Application application) {    ExpenseIncomeDatabase database = ExpenseIncomeDatabase.getInstance(application);    incomeDao = database.incomeDao();    allincomes = incomeDao.getIncomesByDay();}public liveData<List<Income>> getAllincomesByDay() {    return allincomes;}

费用:

@Daopublic interface ExpenseDao {@query("SELECT * FROM expense_table ORDER BY day") liveData<List<Expense>> getExpensesByDay();

IncomeDao:

@Daopublic interface IncomeDao {@query("SELECT * FROM income_table ORDER BY day") liveData<List<Income>> getIncomesByDay();

Dailyviewmodel:

public class DailyFragmentviewmodel extends AndroIDviewmodel {private ExpenseRepository expenseRepository;private IncomeRepository incomeRepository;private liveData<Pair<List<Expense>,List<Income>>> combined;private ExpenseDao expenseDao;private IncomeDao incomeDao;public DailyFragmentviewmodel(@NonNull Application application) {    super(application);    expenseRepository = new ExpenseRepository(application);    incomeRepository = new IncomeRepository(application);    combined = new DailyCombinedliveData(expenseDao.getExpensesByDay(),incomeDao.getIncomesByDay());}public liveData<Pair<List<Expense>,List<Income>>> getExpensesAndIncomes() {    return combined;}
最佳答案我想您想将它们合并,是吗?您将需要一个MediatorliveData,但是那个说您现在需要Object的人是错误的.您需要的是MediatorliveData< Pair< List< Expense>,List< Income>>.

public class CombinedliveData extends MediatorliveData<Pair<List<Expense>,List<Income>>> {    private List<Expense> expenses = Collections.emptyList();    private List<Income> incomes = Collections.emptyList();    public CombinedliveData(liveData<List<Expense>> ld1,liveData<List<Income>> ld2) {        setValue(Pai.create(expenses,incomes));        addSource(ld1,(expenses) -> {              if(expenses != null) {                this.expenses = expenses;             }              setValue(Pair.create(expenses,incomes));         });        addSource(ld2,(incomes) -> {             if(incomes != null) {                this.incomes = incomes;            }             setValue(Pair.create(expenses,incomes));        });    }}

您可能会使用这种通用名称,并且将使用2-arity(Pair)元组对两个liveData进行CombineLatest的实现.

编辑:像这样:

public class CombinedliveData2<A,B> extends MediatorliveData<Pair<A,B>> {    private A a;    private B b;    public CombinedliveData2(liveData<A> ld1,liveData<B> ld2) {        setValue(Pair.create(a,b));        addSource(ld1,(a) -> {              if(a != null) {                this.a = a;             }              setValue(Pair.create(a,b));         });        addSource(ld2,(b) -> {             if(b != null) {                this.b = b;            }             setValue(Pair.create(a,b));        });    }}

请注意,在这种情况下,我失去了将Collections.emptyList()设置为A和B的初始值的能力,并且在访问该对中的数据时,您将需要检查null. 总结

以上是内存溢出为你收集整理的android-是否有可能使两个LiveData中的一个LiveData? 全部内容,希望文章能够帮你解决android-是否有可能使两个LiveData中的一个LiveData? 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1145055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存