Привязка данных + Комната в Котлине. Как связать данные класса в Kotlin? - PullRequest
0 голосов
/ 18 марта 2019

Я сделал одну демонстрацию базы данных Room, которая находится исключительно на kotlin и успешно запущена. Но теперь я превращаю это демо в привязку данных.

Проблема в том, что в kotlin мы делаем класс данных как сущность для базы данных комнаты. А в Java мы просто делаем один класс pojo. Так что в Java все просто, а в котлине что-то другое.

Моя проблема и мой вопрос Как связать класс данных в kotlin?

мой класс данных

@Entity
data class Bill(

    @ColumnInfo(name = "billNo")
    var billNo: Int,
    @ColumnInfo(name = "customerName")
    var customerName: String,
    @ColumnInfo(name = "customerNo")
    var customerNo: String,
    @ColumnInfo(name = "itemList")
    @TypeConverters(ItemListConverter::class)
    var itemList: ArrayList<Item>
   ) {
       @PrimaryKey(autoGenerate = true)
      var billId: Int = 0
     }

Адаптер класса

class BillAdapter(private val ctx: Context, private var payeeList: ArrayList<Bill>) : RecyclerView.Adapter<BillAdapter.ViewHolder>() {

var listdata = payeeList
var layoutInflater:LayoutInflater? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BillAdapter.ViewHolder {

    if(layoutInflater==null){
        layoutInflater = LayoutInflater.from(parent.getContext());
    }

var binding:BillListItemBinding =  DataBindingUtil.inflate(this!!.layoutInflater!!, R.layout.bill_list_item, parent, false)
    return ViewHolder(binding)
}

//this method is binding the data on the list
   override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.binding.bill =  listdata[position]

    }

//this method is giving the size of the list
override fun getItemCount(): Int {
    return listdata.size
}

   inner class ViewHolder(var binding: BillListItemBinding) : 
RecyclerView.ViewHolder(binding.root) {}
}

Ошибка во время выполнения.

e: [kapt] Возникла исключительная ситуация: android.databinding.tool.util.LoggedErrorException: найдено связывание данных ошибки.

уровень приложения build.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt'  // add this line

android {


    dataBinding {
        enabled = true
    }

    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.root.roomdatabinding"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.17'
    implementation "android.arch.persistence.room:runtime:1.1.1"
    kapt "android.arch.persistence.room:compiler:1.1.1"
    implementation 'com.google.code.gson:gson:2.2.4'
    implementation 'android.arch.lifecycle:extensions:1.1.0'
    kapt 'com.android.databinding:compiler:3.1.1'

}

1 Ответ

1 голос
/ 18 мая 2019

Следуйте приведенному ниже коду, это полезно для вас:

class WeatherAdapter(val mContext: Context, private val guestLists:   List<WeatherData>) : RecyclerView.Adapter<WeatherAdapter.ViewHolder>() {
private var weatherList: WeatherData? = null



override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {
    return ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.weather_row, viewGroup, false))
}

override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
    weatherList = guestLists[i]



    viewHolder.bind(weatherList)

}

override fun getItemCount(): Int {
    return guestLists.size
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    private val mBinding: WeatherRowBinding?

    init {
        mBinding = DataBindingUtil.bind(itemView)
    }

    fun bind(weatherList: WeatherData?) {
        mBinding!!.setSetdata(weatherList)
    }
}
}
...