我有两个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? 所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)