4

私は2つActivityのビズを持っています

  1. リストActivity
  2. 詳細Activity

リストにはアイテムのリストが表示され、リストからアイテムをクリックするActivityと詳細が表示されます。ActivityDB からのフィードの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

3 に答える 3

1

同じエンティティの複数のアクティビティで同じ問題に直面していました。ルームデータベースインスタンスをシングルトンとしてコーディングすると便利でした。次のように(ステップ 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;
        }
    }
}

そして、あなたが持っているすべてのViewModelで(クラスはContextパラメータのAndroidViewModelから拡張されています):

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

さて、私の場合、構成アクティビティで値を編集するたびに、他のアクティビティに反映されます。

この助けを願っています。

于 2018-01-17T05:01:57.270 に答える