标签: android-viewmodel

无法创建 AndroidViewModel 子类的实例

我的 ViewModel 类使用 Java,而我的 Activity 类使用 Kotlin。我收到错误

java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) :776) 导致:java.lang.RuntimeException:找不到 com.meme.archcompwordlist.room.WordRoomDatabase 的实现。WordRoomDatabase_Impl 不存在于 android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:93) at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:630) at com.meme.archcompwordlist .room.WordRoomDatabase.getRoomDatabase(WordRoomDatabase.java:22) 在 com。

这是我的 AndroidViewModel 类

public class WordViewModel extends AndroidViewModel {

    private WordRepository repository;

    private LiveData<List<WordEntity>> allWords;

    public WordViewModel(Application application){
        super(application);
        repository = new WordRepository(application);
        allWords = repository.getAllWords();
    }

    public LiveData<List<WordEntity>> getAllWords(){
        return allWords;
    }

    public void insert(WordEntity word){
        repository.insert(word);
    }

    public void deleteAllWords() {
        repository.deleteAllWords();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的活动课 …

java android kotlin android-viewmodel

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

当子包中包含视图布局数据变量类型时,Android Studio 3.2.1中生成的ViewDataBinding类发生错误

我的Viewmodels包含在“ ViewModels”包中。当在我的片段布局xml文件中将其中一个设置为数据变量类型时,生成的ViewDataBinding类将尝试将包当作文件导入。例如:

import com.xyz.myapp.ViewModels;
Run Code Online (Sandbox Code Playgroud)

而不是:

import com.xyz.myapp.ViewModels.*;
Run Code Online (Sandbox Code Playgroud)

然后继续引用视图模型,因为这会ViewModels.MyFragmentViewModel导致进一步的错误。我发现解决此问题的方法是将我所有的视图模型文件都放在com.xyz.myapp目录中。这样做时,一切正常。

这和这里的要求相同我的声誉不足,无法发表评论。我想念什么吗?我需要设置一些选项吗?还是这只是一个错误?


TestFragment.java

import com.xyz.myapp.ViewModels;
Run Code Online (Sandbox Code Playgroud)


fragment_test.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="vm"
            type="com.xyz.myapp.ViewModels.MyFragmentViewModel"/>
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">


        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="@{vm.TEMP}" />
    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)


MyFragmentViewModel.java

import com.xyz.myapp.ViewModels.*;
Run Code Online (Sandbox Code Playgroud)


FragmentTestBinding.java

这是生成的类。错误行被注释。4个错误

import com.xyz.myapp.ViewModels; //Error

public abstract class FragmentTestBinding extends ViewDataBinding {
  @NonNull
  public final CheckBox checkBox;

  @NonNull
  public final EditText editText;

  @Bindable
  protected ViewModels.ProfileViewModel mVm; //Error

  protected FragmentTestBinding(DataBindingComponent _bindingComponent, View _root,
      int _localFieldCount, …
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-viewmodel

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

如何从不访问lifeCycleOwner的存储库中获取LiveData的值以进行观察?

我已经使用的MVVMROOMdatabindig我app.According在 指南应用程序架构,我想现金数据使用room.In的xml布局RecyclerView的项目,我用CategoryViewModelvariable.I获得类别列表从Room数据库LiveData类型.我想将LiveData<list<CategoryItem>>类型更改为MutableLiveData<ArrayList<CategoryViewModel>>类型.因为最后我的适配器消耗ArrayList<CategoryViewModel>数据类型.如何获得值LiveData?当我调用getValue()method时,返回null.这是CategoryItem型号:

    @Entity(tableName = "category_table")
public class CategoryItem implements Serializable {

    @PrimaryKey
    private int id;
    private String title;
    private String imagePath;
    @TypeConverters({SubCategoryConverter.class})
    private ArrayList<String> subCategory;
    @TypeConverters({DateConverter.class})
    private Date lastRefresh;

    public CategoryItem(int id, String title, String imagePath, ArrayList<String> subCategory, Date lastRefresh) {
        this.id = id;
        this.title = title;
        this.imagePath = imagePath;
        this.subCategory …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-room android-livedata android-viewmodel

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

无法打开活动:无法创建 Android 视图模型的实例

我正在创建一个应用程序来扫描条形码并将该信息使用 Android 视图模型和 LiveData 获取到房间数据库中。这是错误信息

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.davin.scoutingapp2019/com.example.davin.scoutingapp2019.DataDisplay}: java.lang.RuntimeException: Cannot create an instance of class com.example.davin.scoutingapp2019.TeamViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6123)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.davin.scoutingapp2019.TeamViewModel
    at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:207)
    at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
    at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
    at com.example.davin.scoutingapp2019.DataDisplay.onCreate(DataDisplay.java:30)
    at android.app.Activity.performCreate(Activity.java:6672)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6123) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at …
Run Code Online (Sandbox Code Playgroud)

android android-viewmodel

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

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
查看次数

如何从 Room 获取 LiveData?

我正在尝试从 Room 获取 LiveData。因此,如果数据库中的任何内容发生更改,我的 RecycleView 可以进行实时更新

我试过不使用 LiveData 并且可以,但是当我添加 LiveData 时总是显示此错误。

error: Not sure how to convert a Cursor to this method's return type     (androidx.lifecycle.LiveData<java.util.List<com.example.models.Club>>).
public abstract java.lang.Object     getAll(@org.jetbrains.annotations.NotNull()
Run Code Online (Sandbox Code Playgroud)

我在这个网站上用谷歌搜索并查看了解决方案,但每个关于这个问题的人都使用了 rxjava、rxandroid、rxkotlin 或 ArrayList。对于他们来说,解决方案是用 List 替换 ArrayList,让 RX 尝试协程。好吧,我正在使用 Coroutine 和 List,但仍然没有进展。

这是我的ClubDao

ClubDao
@Query("SELECT * FROM club")
suspend fun getAll(): LiveData<List<Club>>
Run Code Online (Sandbox Code Playgroud)

在俱乐部我有这个属性

Club
@Entity
data class Club(@PrimaryKey var id: Int,
            @ColumnInfo(name = "logo_url") var logoUrl: String,
            @ColumnInfo(name = "name") var name: String,
            @ColumnInfo(name = "town") var town: String,
            @ColumnInfo(name = …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room android-livedata android-viewmodel

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

ViewModel 实例化导致无限循环

我正在使用我之前使用过几次的模式来实例化一个ViewModel对象。在这种情况下,数据以字符串形式保存在SharedPreferences. 我只需要读取该字符串,将其解析为正确的对象,然后将该对象作为值分配给我的视图模型。

但是当我做作业时,我创建了一个无限循环。

class UserDataViewModel(private val prefs: SharedPreferences): ViewModel() {

    val userData: MutableLiveData<UserData> by lazy {
        MutableLiveData<UserData>().also {
            val userDataString = prefs.getString(Authenticator.USER_DATA, "")
            val ud = Gson().fromJson(userDataString, UserData::class.java)
            userData.value = ud // infinite loop is here
        }
    }

    fun getUserData(): LiveData<UserData> {
        return userData
    }
}
Run Code Online (Sandbox Code Playgroud)

这是onCreateView()保持对 的引用的片段ViewModel

userDataViewModel = activity?.run {
            ViewModelProviders
                 .of(this, UserDataViewModelFactory(prefs))
                 .get(UserDataViewModel::class.java)
            } ?: throw Exception("Invalid Activity")

userDataViewModel
    .getUserData()
    .observe(this, Observer {
        binding.userData = userDataViewModel.userData.value
    })
Run Code Online (Sandbox Code Playgroud)

FWIW,在片段中,我在getUserData() …

android mvvm android-viewmodel

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

无法从 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
查看次数

在三个片段之间共享 ViewModel

我有三个片段 A、B 和 C。B 和 C 是 A 的子片段。如何让这三个片段共享相同的视图模型。从这篇中等文章中,这是我应该做的:


viewModel = activity?.run {
        ViewModelProviders.of(this)[SharedViewModel::class.java]
    } ?: throw Exception("Invalid Activity")       
}
Run Code Online (Sandbox Code Playgroud)

然而,这个是关于在两个片段和一个活动之间共享一个视图模型,所以在我的情况下它不能正常工作。

java android android-fragments kotlin android-viewmodel

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

Kotlin 协程等待 2 个或更多不同的并发请求

我正在使用 kotlin 协程从带有 viewmodel 的 android 中的服务器获取响应。问题是我想获得两个不同的请求响应来更新 ui 但想同时执行它们并等待它们都完成。然后使用收到的所有结果更新 ui。如果在每个请求之后使用 async 和 await 它将一一执行并且它不是并发的,如果使用请求映射和 awaitAll(),我无法处理多种数据类型(数据类),因为两个请求的数据类型不同. 可能不止两个请求。对于这种情况我该怎么办?

val job = viewModelScope.launch {

        val a = async { firstUseCase.execute() }.await()
        val b = async { secondUseCase.execute() }.await()
 }
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewmodel kotlin-coroutines

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