从Room到Edit Text反向的两种方式的数据绑定

时间:2019-02-05 21:02:04

标签: android androidx android-viewmodel two-way-binding

这是我所拥有的:

1)实体BatimentModel,其中包含一些字符串

@Entity(tableName = "batiments")
class BatimentModel : Serializable {
    @PrimaryKey
    lateinit var uuid: String

    var mNomBatiment = ""

    var mNomProprietaire = ""
}

2)此实体的DAO,具有基本方法(我删除了“删除”方法)

@Dao
interface BatimentDao {
    @Query("SELECT * FROM batiments")
    fun getAllBatiment() : LiveData <List<BatimentModel>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertBatiment(vararg batiment: BatimentModel)

    @Query("SELECT * FROM batiments WHERE uuid = :uuid")
    fun getBatimentWithUuid(uuid: String): LiveData <BatimentModel>

    @Update
    fun updateBatiment(vararg batiment: BatimentModel)
}

3)然后,我有一个存储库。它从DAO调用该函数,并且是DAO和ViewModel之间的抽象

4)然后,我有了ViewModel。我保留了所有BatimentModel的列表作为LiveData>

class BatimentViewModel(application: Application): AndroidViewModel(application){

    private val batimentRepository: BatimentRepository
    val allBatiment: LiveData <List<BatimentModel>>

    init {
        batimentRepository = BatimentRepository(application)
        allBatiment = batimentRepository.getAllBatiment()
    }

    fun insert(batiment: BatimentModel){
        batimentRepository.insert(batiment)
    }

    fun updateBatiment(batiment: BatimentModel) {
        batimentRepository.updateBatiment(batiment)
    }

    fun getBatimentWithUUID(uuid: String): LiveData <BatimentModel> {
        return batimentRepository.getBatimentWithUUID(uuid)
    }

}

5)我的片段在布局中的左侧是RecyclerView,右侧是一些EditText。

EditText示例:

<com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/propriete_batiment_nom_batiment"
        android:text="@={batimentPropriete.MNomBatiment}"
        android:hint="Nom du batiment"/>

RecyclerView会自动填充数据库中的列表。如果我使用fab添加“ Batiment”,则可以正确插入该视图并正确刷新视图。

当我选择RecyclerView上的某个元素时,该元素的值将显示在右侧的编辑文本中。如果我编辑其中一个值,然后单击另一个元素(以便在编辑文本中填充新数据),然后再返回第一个元素,则修改后的值仍会被修改!但是它没有保存在数据库中,如果我关闭该应用程序,它将不再存在

“ OnCreateView”片段

 //Bind and get view
  val binding =
        DataBindingUtil.inflate<FragmentBatimentBinding>(inflater, R.layout.fragment_batiment, container, false)

  val v = binding.root

  //Creating RV and Adapter
  val recyclerView = v.rv_batiment
  val adapter = BatimentListAdapter(context!!)
  recyclerView.layoutManager = LinearLayoutManager(context)
  recyclerView.adapter = adapter

  //Setting obersvable
  activity?.let {
      mBatimentViewModel = ViewModelProviders.of(it).get(BatimentViewModel::class.java)
  }

  //Link it with adapter
  mBatimentViewModel!!.allBatiment.observe(
      this,
      Observer<List<BatimentModel>> { t: List<BatimentModel> ->
          adapter.setBatiments(t)
      })


  //Post on clic
  adapter.onItemClick = { batimentModel ->
      binding.batimentPropriete = batimentModel
  }

  //Adding FAB action
  v.fab_add_batiment.setOnClickListener {
        addBatimentDialog()
  }

看起来只有在修改列表后,数据才会被更新并调用观察者。如果它是列表中的对象,则什么都不会发生。

如果我希望将编辑后的值保存在模型中,应该添加什么?

0 个答案:

没有答案