簡體   English   中英

如何使用Room和LiveData保持RecyclerView順序中的更改?

[英]How do I persist changes in RecyclerView order with Room and LiveData?

我在弄清楚RecyclerView項目順序更改后如何更新會議室數據庫中的數據時遇到了麻煩。 我應該如何根據用戶操作更新Room中的LiveData項目?

使用ItemTouchHelper.Callback,我設置了一個onMove回調,它可以更改呈現給用戶的項目順序(在拖放時),但是當我調用更新Room數據庫中項目的順序時,使用一個ViewModel對象,則用戶一次只能移動一個項目。 因此,如果您拖動一個項目,它只會移動一個空間。

這是我在ListAdapter中定義的onMove函數,該函數為回調實現ItemTouchHelperAdapter。

override fun onMove(
        recyclerView: RecyclerView,
        fromViewHolder: RecyclerView.ViewHolder,
        toViewHolder: RecyclerView.ViewHolder
    ): Boolean {

        d(this.TAG, "swap viewHolders: " + fromViewHolder.adapterPosition + " to " + toViewHolder.adapterPosition)


        val workoutRoutine1 = workoutRoutines[fromViewHolder.adapterPosition]
        val workoutRoutine2 = workoutRoutines[toViewHolder.adapterPosition]

        workoutRoutine1.orderNumber = toViewHolder.adapterPosition.toLong()
        workoutRoutine2.orderNumber = fromViewHolder.adapterPosition.toLong()

        //this.workoutRoutinesViewModel.update(workoutRoutine1)
        //this.workoutRoutinesViewModel.update(workoutRoutine2)

        notifyItemMoved(fromViewHolder.adapterPosition, toViewHolder.adapterPosition)
        return true
    }

這是我的DAO對象

@Dao
interface WorkoutRoutineDAO {
    @Insert
    suspend fun insert(workoutRoutine: WorkoutRoutine)

    @Update(onConflict = OnConflictStrategy.REPLACE)
    suspend fun update(workoutRoutine: WorkoutRoutine)

    @Delete
    suspend fun delete(workoutRoutine: WorkoutRoutine)

    @Query("DELETE FROM workout_routine_table")
    fun deleteAll()

    @Query("SELECT * FROM workout_routine_table ORDER BY order_number ASC")
    fun getAllWorkoutRoutines(): LiveData<List<WorkoutRoutine>>

    @Query("SELECT COALESCE(MAX(order_number), -1) FROM workout_routine_table")
    fun getLargestOrderNumber(): Long
}

這是我的RoomDatabase對象

@Database(entities = [WorkoutRoutine::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun workoutRoutineDAO(): WorkoutRoutineDAO

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(
            context: Context,
            scope: CoroutineScope
        ): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance =
                    Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "app_database")
                        .addCallback(WorkoutRoutineDatabaseCallback(scope))
                        .build()
                INSTANCE = instance
                instance
            }
        }
    }

    private class WorkoutRoutineDatabaseCallback(
        private val scope: CoroutineScope
    ) : RoomDatabase.Callback() {

    }
}

這是我實現的ViewModel對象。

class WorkoutRoutinesViewModel(application: Application) : AndroidViewModel(application) {
    private val workoutRoutinesRepository: WorkoutRoutineRepository

    val allWorkoutRoutines: LiveData<List<WorkoutRoutine>>

    init {
        // Get the DAO
        val workoutRoutineDAO = AppDatabase.getDatabase(application, viewModelScope).workoutRoutineDAO()
        // Build a new data repository for workout routines
        workoutRoutinesRepository = WorkoutRoutineRepository(workoutRoutineDAO)
        // Get a live view of the workout routines database
        allWorkoutRoutines = workoutRoutinesRepository.allRoutines
    }

    fun insert(workoutRoutine: WorkoutRoutine) = viewModelScope.launch(Dispatchers.IO) {
        workoutRoutinesRepository.insert(workoutRoutine)
    }

    fun update(workoutRoutine: WorkoutRoutine) = viewModelScope.launch(Dispatchers.IO) {
        workoutRoutinesRepository.update(workoutRoutine)
    }

    fun delete(workoutRoutine: WorkoutRoutine) = viewModelScope.launch(Dispatchers.IO) {
        workoutRoutinesRepository.delete(workoutRoutine)
    }
}

我希望用戶能夠將項目移動n個空格,然后刪除,並在用戶刪除項目時執行對Room數據庫的更新,但是如果我將Room更新放在onMove方法中,則用戶只能移動項目一次。

我試圖了解在回收者視圖中對象順序更改時更新會議室數據的正確方法。 我正在嘗試使這些對象的順序持久化,即使用戶退出應用程序或更改活動或其他情況也是如此。 我應該如何使用LiveData將這些更改回傳到Room數據庫?

您可以按照上Udacity指南。 它是免費的,由Google制造,並使用Kotlin。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM