我的 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)
这是我的活动课 …
我的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目录中。这样做时,一切正常。
这和这里的要求相同。我的声誉不足,无法发表评论。我想念什么吗?我需要设置一些选项吗?还是这只是一个错误?
import com.xyz.myapp.ViewModels;
Run Code Online (Sandbox Code Playgroud)
<?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)
import com.xyz.myapp.ViewModels.*;
Run Code Online (Sandbox Code Playgroud)
这是生成的类。错误行被注释。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) 我已经使用的MVVM和ROOM与databindig我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
我正在创建一个应用程序来扫描条形码并将该信息使用 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) 考虑以下简单设置。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
我正在尝试从 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
我正在使用我之前使用过几次的模式来实例化一个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() …
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) 我有三个片段 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)
然而,这个是关于在两个片段和一个活动之间共享一个视图模型,所以在我的情况下它不能正常工作。
我正在使用 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)