【问题标题】:How can i get a list from livedata?如何从 livedata 获取列表?
【发布时间】:2020-06-08 10:34:20
【问题描述】:

我正在开发一个将事务存储在本地 SQLite 本地数据库中的应用程序,我正在使用 Room。我有 2 个活动,包括 MainActivity,其中我有一个包含所有事务(添加、删除事务)的回收器视图,还有一个按钮,可以将您带到具有事务图表的其他活动(图表活动)。

现在,如果数据库中没有交易,我不想让用户转到 Chart 活动(因为那里什么都看不到)。

这是我道中的查询:

@Query("SELECT * FROM transaction_table WHERE amount < 0 AND strftime('%m', creationDate) = :month")
LiveData<List<Transaction>> getNegativeTransactionsByMonth(String month);

我的仓库:

public LiveData<List<Transaction>> getAllNegativeTransactionsByMonth(String month) {
    return transactionDao.getNegativeTransactionsByMonth(month);
}

我的视图模型

public LiveData<List<Transaction>> getAllNegativeTransactionsByMonth(String month) {
    return repository.getAllNegativeTransactionsByMonth(month);
}

主活动:

btnChart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final LiveData<List<Transaction>> viewModelData2 = transactionViewModel.getTransactionsByMonth(currentMonth);
            viewModelData2.observe(MainActivity.this, new Observer<List<Transaction>>() {
                @Override
                public void onChanged(List<Transaction> transactions) {
                    if(!transactions.isEmpty()) {
                        Intent intent = new Intent(getApplicationContext(), ChartActivity.class);
                        intent.putExtra("SELECTED_MONTH_NUMBER", SELECTED_MONTH_NUMBER);
                        startActivity(intent);
                    } else {
                        Toast.makeText(MainActivity.this, "Add a negative transaction to look at the chart", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }
    });

在上面的代码中,我有一个用于将您带到图表活动的按钮的侦听器。我为 ViewModel 数据创建了一个观察者,并将逻辑放在未更改的方法中,如果事务不为空,则启动图表活动,如果不显示 toast。

问题是每次创建新事务(运行未更改的方法)时都会运行 if 子句我不想要这个,我希望 if 子句仅在我按下图表按钮时运行。

我知道使用 LiveData 可能无法实现我想要实现的目标。 这就是为什么我要求一种从数据库中获取事务列表并检查它是否为空的方法。欢迎任何帮助。谢谢。

【问题讨论】:

    标签: android android-sqlite android-room android-livedata


    【解决方案1】:

    我建议你从 setOnClickListener 中取出一个观察者,并使用布尔标志转到下一个活动。

    例如: 取一个布尔值isTransactionsEmpty 并使用一种方法来观察变化,根据列表是否为空,将布尔值设置为 true 或 false。

    boolean isTransactionsEmpty = true;
    
    void onCLicks(){
        btnChart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!isTransactionsEmpty) {
                    Intent intent = new Intent(getApplicationContext(), ChartActivity.class);
                    intent.putExtra("SELECTED_MONTH_NUMBER", SELECTED_MONTH_NUMBER);
                    startActivity(intent);
                } else {
                    Toast.makeText(MainActivity.this, "Add a negative transaction to look at the chart", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    
    void observeTransactionList(){
        transactionViewModel.getTransactionsByMonth(currentMonth).observe(MainActivity.this, new Observer<List<Transaction>>() {
            @Override
            public void onChanged(List<Transaction> transactions) {
                isTransactionsEmpty = transactions.isEmpty();
            }
        });
    }
    

    【讨论】:

    • 这是一个经过深思熟虑的解决方案,这样我们就不必直接检查交易列表,而只需检查每次添加新交易时更新的变量。谢谢。
    • 是的,最好的做法是在有空列表时隐藏按钮本身。可见性应该隐藏在 onChange 方法中。
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2019-12-31
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多