小编Mus*_*oud的帖子

绑定变量为空.. 如何让 UI 中的观察者等到查询的 Livedata 从数据库中提取出来?

我正在尝试从数据库中获取数据,然后将其以片段形式绑定到 XML。所以我有存储库将数据从 DB 获取到 ViewModel,UI 片段正在观察结果,然后将数据绑定到 XML。但问题是该应用程序正在粉碎说数据为空即使我在观察者中使空数据无效。

我已经尝试在后台线程上执行查询,它似乎在返回数据(照片)时正常工作。

我认为问题在于查询需要时间,片段中的观察者没有等到查询完成。所以查询没问题,我完全按照 Google 示例进行操作,但无法找出问题所在。提前致谢。

_照片库

    class PhotoRepository @Inject constructor(
private val photoDao: PhotoDoa
) {

fun loadPhotoById(photoId: Int): LiveData<Photo> {
//        var photo: Photo? = null 
//        this is working and i am getting the photo object
//        appExecutors.diskIO().execute { 
                photo = photoDao.getObjectPhotoById(photoId)
           } 

    return photoDao.getPhotoById(photoId)
 }

}
Run Code Online (Sandbox Code Playgroud)

_PhotoViewModel

class PhotoViewModel @Inject constructor(private val photoRepository: 
             PhotoRepository) :
ViewModel() {

private var _photoId = MutableLiveData<Int>()
val photoId: LiveData<Int>
    get() = _photoId


val photo: LiveData<Photo> …
Run Code Online (Sandbox Code Playgroud)

android mvvm kotlin android-livedata

7
推荐指数
1
解决办法
1360
查看次数

如何使用扩展 BaseActivity 的数据绑定显示 childActivity?

我使用基础活动作为另一个活动“RecicpeActivity”的父活动,因为我已经覆盖了基础活动中的 setContentView 方法,以便子活动可以使用它并传递其布局以在框架布局中膨胀。子活动“RecicpeActivity”使用数据绑定来设置其视图。我正在做的是我试图将子活动的布局膨胀到基础活动中的框架布局“容器”中,但根本没有考虑数据绑定,因为我有一个白屏,即使我已经看到了调试时将子活动的布局作为框架布局的子项。

  • 我尝试了两种方法:

1- 第一个我尝试通过调用 setContentView 来传递子活动的布局,并将传递的布局膨胀到基础活动中的框架布局。

2- 第二个我尝试在基本活动中使用数据绑定,但我认为这无关紧要。

_ChildActivity

public class RecipeActivity extends BaseActivity {
private ActivityRecipeBinding mBinding;
private static final String RECIPE_INTENT_KEY = "recipe key";
private ScrollView mScrollView;
private RecipeViewModel recipeViewModel;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    recipeViewModel = 
          ViewModelProviders.of(this).get(RecipeViewModel.class);
    mBinding = DataBindingUtil.inflate(
                getLayoutInflater(), 
                R.layout.activity_recipe, null, false);
    setContentView(R.layout.activity_recipe);

    // This method is implemented in the BaseActivity.
    showProgressBar(true);
    recipeViewModel.getRecipe().observe(this, new Observer<Recipe>() {
        @Override
        public void onChanged(Recipe recipe) {
            if (recipe != null){
                if (recipe.getRecipe_id().equals(
                    recipeViewModel.getRecipeId())){
                    mBinding.setRecipe(recipe); …
Run Code Online (Sandbox Code Playgroud)

data-binding android layout-inflater

5
推荐指数
1
解决办法
1440
查看次数