私はKotlinの初心者です。KotlinでViewModelProviders.of(this)を使用する方法を教えてください
Javaの私のコードは
mFavViewModel = ViewModelProviders.of(this).get(FavouritesViewModel.class);
KotlinでViewModelProvidersクラスが見つかりません。自動変換を試みましたが、エラーが表示されます。ありがとう。
これが私のDataModelクラスです
class FavoritesDataViewModel:ViewModel{
private var mFavHelper: DatabaseHelper
private lateinit var mfav:ArrayList<Favorites>
constructor(application: Application) {
mFavHelper = DatabaseHelper(application)
}
fun getListFav():List<Favorites>{
if (mfav==null){
mfav = arrayListOf<Favorites>()
createDummyList()
loadFav()
}
val clonedFavs = arrayListOf<Favorites>()
for (i in 0 until mfav.size) {
clonedFavs.add(Favorites(mfav.get(i)))
}
return clonedFavs
}
fun createDummyList(){
addFav("https://www.journaldev.com", Date().getTime())
addFav("https://www.medium.com", Date().getTime())
addFav("https://www.reddit.com", Date().getTime())
addFav("https://www.github.com", Date().getTime())
addFav("https://www.hackerrank.com", Date().getTime())
addFav("https://www.developers.Android.com", Date().getTime())
}
fun addFav(url:String,date:Long):Favorites{
val db:SQLiteDatabase = this.mFavHelper.getWritableDatabase();
val values: ContentValues = ContentValues();
values.put(DbSettings.DbEntry.COL_FAV_DATE,date)
values.put(DbSettings.DbEntry.COL_FAV_URL,url)
val id:Long = db.insertWithOnConflict(DbSettings.DbEntry.TABLE,
null,
values,SQLiteDatabase.CONFLICT_REPLACE)
db.close()
val fav:Favorites = Favorites(id,url,date)
mfav.add(fav)
return Favorites(fav)
}
fun loadFav(){
mfav.clear()
val db:SQLiteDatabase = mFavHelper.readableDatabase
val cursor:Cursor = db.query(DbSettings.DbEntry.TABLE,
arrayOf(
DbSettings.DbEntry._ID,
DbSettings.DbEntry.COL_FAV_URL,
DbSettings.DbEntry.COL_FAV_DATE
),
null, null, null, null, null);
while (cursor.moveToNext()){
val idxID:Int = cursor.getColumnIndex(DbSettings.DbEntry._ID)
val idxURL:Int = cursor.getColumnIndex(DbSettings.DbEntry.COL_FAV_URL)
val idxDate:Int = cursor.getColumnIndex(DbSettings.DbEntry.COL_FAV_DATE)
mfav.add(Favorites(cursor.getLong(idxID),cursor.getString(idxURL),cursor.getLong(idxDate)))
}
cursor.close()
db.close()
}
}
次のコード行で試してみました
var mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.Java)
implementation 'Android.Arch.lifecycle:extensions:1.1.1'
これはエラーを与えています:
Caused by: Java.lang.RuntimeException: Cannot create an instance of class com.nearex.mykotlinsample.viewmodel.FavoritesDataViewModel
at Android.Arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.Java:153)
at Android.Arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.Java:210)
at Android.Arch.lifecycle.ViewModelProvider.get(ViewModelProvider.Java:134)
at Android.Arch.lifecycle.ViewModelProvider.get(ViewModelProvider.Java:102)
at com.nearex.mykotlinsample.view.MainActivity.onCreate(MainActivity.kt:29)
Javaの場合
AndroidX以前の場合
implementation 'Android.Arch.lifecycle:extensions:1.1.1'
implementation "Android.Arch.lifecycle:viewmodel:1.1.0"
AndroidXの場合
implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0"
最新バージョンでは、ViewModelは次のように宣言できます。
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
Kotlinの場合
AndroidX以前の場合
implementation 'Android.Arch.lifecycle:extensions-ktx:1.1.1'
implementation "Android.Arch.lifecycle:viewmodel-ktx:1.1.1"
アンドロイド用
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
ViewModel宣言
val model = ViewModelProvider(activity)[MyViewModel::class.Java]
最新の AndroidX依存バージョンについては、以下のリンクを参照してください
注:AndroidXより前のバージョンでは、依存関係のバージョンは更新されません
以下でお試しください
var mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.Java)