Как удалить элемент recyclerrview из базы данных комнаты - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть программа, над которой я сейчас работаю. Мне нужно сделать так, чтобы, когда я нажимал кнопку «удалить» после ввода названия продукта, он удалял элемент представления переработчика из списка и базы данных. Вот скриншот того, что я имею в виду:

Image of app

Я скопировал и вставил некоторые основные структуры, которые, как я знаю, мне нужно изменить. Я просто не знаю, что именно мне нужно делать. Эти разделы закомментированы.

Вот код в MainActivity.kt:

import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private var adapter: FoodListAdapter? = null
    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

        adapter = FoodListAdapter(R.layout.food_row)
        food_recycler.layoutManager = LinearLayoutManager(this)
        food_recycler.adapter = adapter

        buttonAdd.setOnClickListener { viewModel.insertFood(Food(editFoodName.text.toString())) }

      //  buttonDelete.setOnClickListener { viewModel.insertFood(Food(editFoodName.text.toString())) }


        viewModel.allFoods?.observe(this, Observer { foods ->
            foods?.let  {
                adapter?.setFoodList(it)
            }
        })
    }
}

Код в FoodDao.kt:

import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface FoodDao {
    @Insert
    fun insertFood(product: Food)

    @Query("SELECT * FROM foods")
    fun getAllFoods(): LiveData<List<Food>>

    @Query ("SELECT * FROM foods WHERE foodName = :name")
    fun findFood(name: String) : List<Food>
}

Код в MainViewModel.kt:

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel

class MainViewModel(application: Application) : AndroidViewModel(application) {
    private val repository: FoodRepository =
        FoodRepository(application)

    var allFoods:  LiveData<List<Food>>?

    init {
        allFoods = repository.allFoods
    }

    fun insertFood(food: Food) {
        repository.insertFood(food)
    }

//    fun deleteFood(food: Food) {
//        repository.deleteFood(food)
//    }


}

Код в FoodRepository.kt:

import android.app.Application
import android.os.AsyncTask
import androidx.lifecycle.LiveData

class FoodRepository(application: Application) {
    val allFoods: LiveData<List<Food>>?

    private var foodDao: FoodDao?

    init {
        val db: FoodDatabase? =
            FoodDatabase.getDatabase(application)
        foodDao = db?.foodDao()
        allFoods = foodDao?.getAllFoods()
    }

    fun insertFood(newfood: Food) {
        val task = InsertAsyncTask(foodDao)
        task.execute(newfood)
    }

    private class InsertAsyncTask constructor(private val asyncTaskDao: FoodDao?) :
        AsyncTask<Food, Void, Void>() {

        override fun doInBackground(vararg params: Food): Void? {
            asyncTaskDao?.insertFood(params[0])
            return null
        }
    }

//    fun deleteFood(newfood: Food) {
//        val task = DeleteAsyncTask(foodDao)
//        task.execute(newfood)
//    }
//
//    private class DeleteAsyncTask constructor(private val asyncTaskDao: FoodDao?) :
//        AsyncTask<Food, Void, Void>() {
//
//        override fun doInBackground(vararg params: Food): Void? {
//            asyncTaskDao?.insertFood(params[0])
//            return null
//        }
//    }
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

сначала вы устанавливаете настройку метода удаления.

@Delete
    fun deleteFood(product: Food);

Ваш метод модели представления верен, а метод репозитория верен. Вы вызываете метод в действии.

 buttonDelete.setOnClickListener { viewModel.deleteFood(Food(editFoodName.text.toString())) }

Когда вы вызываете все продукты, вам необходимо обновить представление вашего переработчика с вашими новыми данными.

viewModel.allFoods?.observe(this, Observer { foods ->
            foods?.let  {          
                adapter?.setFoodList(it)
              recyclerView?.notifyDataSetChanged() 


            }
        })
1 голос
/ 26 апреля 2020

Дело в том, что вам нужно обновить представление переработчика, добавив новые данные:

recyclerView?.notifyDataSetChanged() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...