标签: android-livedata

从 LifeCycleService 观察 LiveData

我正在使用 google android 架构组件,并且我有一个前台服务,它是 LifeCycleService。

问题是当我尝试从我的存储库观察 LiveData 时,可观察的 onChanged 不会触发。如果我使用observeForever而不是observe它会触发。

什么会导致这样的问题?

service lifecycle android android-lifecycle android-livedata

2
推荐指数
1
解决办法
2003
查看次数

数据绑定 - 访问 LiveData 中包含的各个属性

有没有办法用 LiveData 和数据绑定来做这样的事情?

ViewModel 有这个属性:

val weather: LiveData<UnitSpecificCurrentWeatherEntry>
Run Code Online (Sandbox Code Playgroud)

我想在布局中做什么:

<TextView
    android:id="@+id/textView"
    android:text="@{viewmodel.weather.value.someProperty}"... />
Run Code Online (Sandbox Code Playgroud)

这是否可以以任何方式实现,或者我是否必须针对所包含对象的每个属性将 LiveData 中包含的对象拆分为多个对象?

android kotlin android-databinding android-livedata

2
推荐指数
1
解决办法
810
查看次数

将 MutableList 包装在 LiveData 或 MutableLiveData 中

MutableList将 a 包装在LiveDataor中的建议方法是什么MutableLiveData,以便可以修改列表并观察它所发生的变化?

我在 Room 中有一些相当短的表(<20 个项目)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作其他更大表的查询中的过滤器。我的想法是将 a 分配给我的应用程序中的模型类,并通过将此类包装在或 中MutableList来使其可观察。然后,通过更新这些选择中的项目,我可以触发大型表上的必要查询。MutableLiveDataLiveData

目前我的代码具有以下结构,我已在问题中将其精简为我认为相关的内容。最终我想keyset在更复杂的查询中使用多个。我的简化模型文件如下,

class Model(application : Application) : AndroidViewModel(application)
{
  val keys    : LiveData<List<Key>>
  val keyset  : LiveData<MutableList<Key>>
  val values  : LiveData<List<Value>>
  init {
    keys   = repository.keys
    values = repository.values
    keyset = mutableListOf<Key>() // I'm not entirely sure how to instantiate LiveData<MutableList<Key>>
  }
}
Run Code Online (Sandbox Code Playgroud)

它依赖于存储库,

class Repository(private val queryset : QuerySet)
{
   val keys   : LiveData<List<Key>>   = queryset.getKeys()
   val values : …
Run Code Online (Sandbox Code Playgroud)

kotlin android-livedata mutablelivedata mutablelist

2
推荐指数
1
解决办法
1万
查看次数

Android Timber 多次记录

考虑以下简单设置。1 个片段与 1 个 ViewModel:

分段

class TestFragment : Fragment() {

    private val viewModel by lazy {
        ViewModelProviders.of(this).get(TestViewModel::class.java)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_test, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel.testLiveData.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
            Log.d("###", "whattt")
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

class TestViewModel : ViewModel() {

    private val myVariable = Log.d("###", "Test")

    val testLiveData = MutableLiveData(false)
}
Run Code Online (Sandbox Code Playgroud)

为什么我从 Fragment 和 ViewModel 获得最多三倍的日志输出?

D/###: Test
D/###: whattt
D/###: Test
D/###: …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-livedata android-viewmodel android-architecture-components

2
推荐指数
1
解决办法
1805
查看次数

Android数据绑定不观察kotlin的liveData构建器

Android数据绑定不观察kotlin的liveData构建器

以下代码将创建一个 LiveData,并且应该通过数据绑定来观察它,XML但它不起作用

val text =
        liveData(Dispatchers.Default) {
            emit("Hello")
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果它被观察到Kotlin它工作得很好

  vm.text.observe(lifeCycleOwner,{
            binding.texti.text = it
        })
Run Code Online (Sandbox Code Playgroud)

xml:

val text =
        liveData(Dispatchers.Default) {
            emit("Hello")
}
Run Code Online (Sandbox Code Playgroud)

如果我将实时数据的定义更改为:

val text = MutableLiveData("Hello")
Run Code Online (Sandbox Code Playgroud)

数据绑定自动观察并设置文本

是我做错了还是bug?

data-binding android kotlin android-livedata

2
推荐指数
1
解决办法
810
查看次数

无法从 Fragment 中的 ViewModel 观察 LiveData

RecyclerView我的里面有ViewPager一个Fragment。此RecyclerView显示从服务器获取的数据。它通常可以工作,但我无法使用ViewModel和实现相同的功能LiveData,因为当从 更改时,该livedata.observe方法不会被调用。livedataViewModel

这是我的MonthlyOrderViewModel.java类的源代码

public class MonthlyOrderViewModel extends AndroidViewModel {

private Retrofit retrofit;
private RetrofitServices retrofitServices;
private MutableLiveData<MonthlyOrderHistory> monthlyOrderHistoryMutableLiveData = new MutableLiveData<>();

public MonthlyOrderViewModel(@NonNull Application application) {
    super(application);
    retrofit = RetrofitFactory.getRetrofit();
    retrofitServices = retrofit.create(RetrofitServices.class);
}

public MutableLiveData<MonthlyOrderHistory> getMonthlyOrderHistoryMutableLiveData() {
    return monthlyOrderHistoryMutableLiveData;
}
public void fetchMonthlyOrders() {
    Call<MonthlyOrderHistory> call = retrofitServices.getAllMonthlyOrderHistory(IpharmaApplication.getInstance().getLoggedInUser().getId());
    call.enqueue(new Callback<MonthlyOrderHistory>() {
        @Override
        public void onResponse(Call<MonthlyOrderHistory> call, Response<MonthlyOrderHistory> response) {

            MonthlyOrderHistory monthlyOrderHistory = response.body(); …
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-viewmodel mutablelivedata

2
推荐指数
1
解决办法
4818
查看次数

当应用程序来自后台时,观察者总是被触发

livedata在 viewpager 中的 Fragment 中使用 。我观察 liveDataonActivityCreated()并在列表中显示数据。到目前为止一切顺利,我没有任何问题。另一方面,当我将应用程序置于后台并返回到 viewpager 的任何页面时,会Observer再次调用,我不明白为什么!请帮助我理解。我什至没有浏览onResume()相关片段。

android observers android-livedata

2
推荐指数
1
解决办法
3256
查看次数

Android:通过Activity中的LiveData和ViewModel观察Room DB

我创建了一个基本示例,其中的活动是通过 LiveData 观察房间数据库。欲了解更多信息,请查看以下代码:

    @Dao
    interface NoteDao {
        @Query("SELECT * FROM note ORDER BY date_created DESC")
        fun getAll(): LiveData<List<Note>>
    }

    // Repository
    class ReadersRepository(private val context: Context) {
        private val appDatabase = Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
                    .build()
        fun getAllNotes(): LiveData<List<Note>> {
            return appDatabase.getNoteDao().getAll()
        }
    }

    // ViewModel   
    class AllNotesViewModel(application: Application) : AndroidViewModel(application) {
        private val repository = ReadersRepository(application)
        internal var allNotesLiveData: LiveData<List<Note>> = repository.getAllNotes()
    }

    // Activity
    class MainActivity : BaseActivity<AllNotesViewModel>() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            setSupportActionBar(toolbar)

            viewModel.allNotesLiveData.observe(this, Observer …
Run Code Online (Sandbox Code Playgroud)

android android-room android-livedata android-viewmodel

2
推荐指数
1
解决办法
2288
查看次数

为什么 LiveData.getValue 返回 null 除非调用了observe?

我有一个ViewModel具有 type 属性的属性LiveData<UserData>,正在从 Room 数据库中读取。

其代码如下:

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

    private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
    val userData: LiveData<UserData?> = userDataDao.getUserData()

}
Run Code Online (Sandbox Code Playgroud)

在关联的活动中,我获得了对视图模型的引用:

private val viewModel: UserDataViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

UserData在该活动中,我需要获取按钮单击的值:

private fun handleClick(view: View) {
    viewModel.userData.value?.let {
        // do stuff if the userData is present
    }
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,除非用户在加载数据之前按下按钮,否则它永远不应该为空。

然而,正如代码所示,对的调用viewModel.userData.value始终为空,并且该let块永远不会执行。

但是,如果我在 中添加此语句onCreatelet单击处理程序中的块将根据需要执行

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel.userData.observe(this, Observer {
        // do nothing …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle kotlin android-room android-livedata

2
推荐指数
1
解决办法
2628
查看次数

ArrayList 未观察实时数据(Kotlin)?

我在项目中使用 Android Jetpack 组件 ViewModel + 实时数据之一,当使用字符串和 Int 等普通数据时,它对我来说效果很好,但当涉及到 arrayList 时,它不会观察到任何内容

这是我的代码

class MainActivityModel : ViewModel() {

    private var dataObservable = MutableLiveData<ArrayList<Int>>()

    init {
        dataObservable.value = arrayListOf(1,2,3,4,5)
    }

    fun getInt(): LiveData<ArrayList<Int>> = dataObservable

    fun addInt(i:Int) {
        dataObservable.value!![i] = dataObservable.value!![i].plus(1)
    }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-livedata android-jetpack

2
推荐指数
1
解决办法
2895
查看次数