当前位置: 首页 > 知识库问答 >
问题:

LiveData不将数据从一个活动更新到另一个活动-Android

淳于嘉树
2023-03-14

我有两个活动

  1. 列表活动
  2. 详细活动

列表活动显示项目列表,单击列表中的项目时显示详细信息活动。在列表活动中,我们观察从数据库获取提要的情况,一旦我们这样做了,我们就更新了用户界面。

列表页

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
    }

}

为了简单起见,已经抽象了一些代码。如果需要,我可以添加它们来跟踪问题

共有3个答案

吉栋
2023-03-14

我也有同样的问题。在下面的代码中,我忘记了一行,单例不起作用(问题与主要答案相同)。

@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {

   abstract val sleepDatabaseDao: SleepDatabaseDao

   companion object {

       @Volatile
       private var INSTANCE: SleepDatabase? = null

       fun getInstance(context: Context): SleepDatabase {
           synchronized(this) {
               var instance = INSTANCE

               if (instance == null) {
                   instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database"
                   )
                           .fallbackToDestructiveMigration()
                           .build()
                   INSTANCE = instance
               }
               return instance
           }
       }
   }
}

遗忘的台词:

INSTANCE = instance
贺栋
2023-03-14

我在同一实体的多个活动中面临着同样的问题。对我来说,将Room数据库实例作为一个单独的实例进行编码是很有用的,比如:这个(步骤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中(类从AndroidViewModel扩展为Context参数):

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

现在,在我的例子中,每次我在配置活动中编辑一个值,它都会反映在其他活动中。

希望这有帮助。

邢项禹
2023-03-14

经过大量的调查和一些想法,从这个答案从另一个问题。我解决了这个问题。

问题

database.feed没有创建数据库的单例实例,因为第一个活动有另一个实例,其中LiveData监听更改,而第二个活动有另一个实例,在更新数据后,回调被忽略。

解决方案

使用Dagger或任何其他依赖注入来确保只创建DB和DAO的单个实例。

 类似资料:
  • 我目前正在做一个项目,我需要帮助。 我想发送的名称,总数量和总价的一个产品的数量在我的添加到购物车活动。 @override public void onListClick(final ItemInfo item){ 上面应该有什么代码发送到购物车活动?? toast.maketext(mainactivity.this,“added To cart”,toast.length_short).sh

  • 我尝试使用 如有任何帮助,不胜感激,谢谢。

  • 我想把意图转移到Xamarin.Android中的另一个活动。基本上,我需要Intent.data和Intent.clipdata到另一个活动,所以我使用下面的代码来传输Intent,但我不知道检索它的正确方法。 下面是Main Activity中的代码 在第二活动中 如何在第二个活动中检索意图?

  • 我试图将图像从一个活动发送到另一个活动,但我不知道如何设置ImageView。

  • 问题内容: 听起来很简单,但我无法使其正常工作。我有两个活动。第一个是表单,第二个是根据在第一个活动中输入的值显示JSON文件中的数据。 因此,我正在尝试制作一个简单的版本。我有一个EditText和一个按钮,因此当他们按下按钮时,EditText中的内容将出现在下一个活动的TextView中。 到目前为止,这是我的代码: 主要活动 主要XML 第二次活动 第二个XML 通过这种方式,我为Edit

  • 问题内容: 我对android非常陌生,我正在尝试将用户输入的数据(他们的名字)发送到另一个活动。过去,我可以使用Intent在活动之间发送单行代码,但是我无法解决如何向两个不同的TextView发送两个不同的字符串。 这是到目前为止我的MainActivity代码: 我第二项活动MainGame的代码: 当我运行它时,我得到了两个TextView中都为“ name2”添加的内容。我需要做些什么来