3

我有2 ActivityLiveData不會從一個活動更新數據到另一個活動 - 的Android

  1. 列表Activity
  2. 詳細Activity

列表Activity顯示項和細節Activity是列表在點擊列表中的項目時顯示。 在ListActivity中,我們觀察到從數據庫中提取數據源,一旦我們完成,我們就更新UI。

列表頁面

feedViewModel.getFeeds().observe(this, Observer { feeds -> 
     feeds?.apply { 
      feedAdapter.swap(feeds) 
      feedAdapter.notifyDataSetChanged() 
     } 
}) 

現在我們有一個DetailActivity網頁,其中更新飼料(項目)和Activity完成,但變化不會反映在ListActivity

詳細信息頁面

override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     feedViewModel.setFeedId(id) 
     feedViewModel.updateFeed() 
} 

訂閱視圖模型

class FeedViewModel(application: Application) : AndroidViewModel(application) { 


    private val feedRepository = FeedRepository(FeedService.create(getToken(getApplication())), 
      DatabaseCreator(application).database.feedDao()) 

    /** 
    * Holds the id of the feed 
    */ 
    private val feedId: MutableLiveData<Long> = MutableLiveData() 

    /** 
    * Complete list of feeds 
    */ 
    private var feeds: LiveData<Resource<List<Feed>>> = MutableLiveData() 

    /** 
    * Particular feed based upon the live feed id 
    */ 
    private var feed: LiveData<Resource<Feed>> 

    init { 
     feeds = feedRepository.feeds 
     feed = Transformations.switchMap(feedId) { id -> 
      feedRepository.getFeed(id) 
     } 
    } 

    /** 
    * Get list of feeds 
    */ 
    fun getFeeds() = feeds 

    fun setFeedId(id: Long) { 
     feedId.value = id 
    } 

    /** 
    * Update the feed 
    */ 
    fun updateFeed() { 
     feedRepository.updateFeed() 
    } 

    /** 
    * Get feed based upon the feed id 
    */ 
    fun getFeed(): LiveData<Resource<Feed>> { 
     return feed 
    } 

} 

爲了簡化目的,一些代碼已經被抽象出來的。如果需要,我可以添加它們來跟蹤問題

回答

4

經過大量的調查和this answer從另一個問題的一些想法。我找出了這個問題。

問題

數據庫由於其第一Activity了另一個實例,其中LiveData被監聽的變化和第二Activity有另一個實例,其中更新數據後的回調是的DatabaseCreator(application).database.feedDao()沒有創建單一實例忽略。

使用匕首或任何其它依賴注入,以確保DB和DAO的僅單個實例被創建。

+0

我有完全相同的問題,但是我已經註釋了DB和DAO的實例作爲單例。你改變了什麼?順便說一句,我使用匕首2. 如果你想更多的信息在這裏是我發佈的問題:https://stackoverflow.com/questions/48267724/view-not-updating-after-first-time-triggering -livedata-時,使用背景在職 –

0

我在同一個實體的多個活動中面臨同樣的問題。對我來說,是房間數據庫實例代碼作爲一個Singleton一樣有用:this (step 5)

例子:

public abstract class MyDatabase extends RoomDatabase { 
    private static MyDatabase mMyDatabase; 
    public static MyDatabase getInstance(Context context) { 
     if(mMyDatabase==null){ 
      mMyDatabase = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "app_database").build(); 
      return mMyDatabase; 
     } 
    } 
} 

,並在每個視圖模型,你有(類從AndroidViewModel擴展了Context參數):

public MyViewModel(@NonNull Application application) { 
     super(application); 
     mMyDatabase = MyDatabase.getInstance(application.getApplicationContext()); 
} 

現在,就我而言,每次我在配置活動中編輯一個值時,都會在其他活動中反映出來。

希望得到這個幫助。

相關問題