Как исправить требуемый повторяющийся, но найденный список в Kotlin

#android #kotlin #mutablelist

#Android #kotlin #изменяемый список

Вопрос:

Здравствуйте, я учусь создавать приложения с kotlin, но я получил stack с этой ошибкой, в которой говорится «Требуется повторяющийся, найденный список», как я могу решить эту проблему? пожалуйста, посмотрите мой код ниже, спасибо

 class MainActivity : AppCompatActivity(),ProductView {

private lateinit var productAdapter: ProductAdapter
private var productList: MutableList<ProductData> = mutableListOf()
private lateinit var dataPresenter : DataPresenter

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

    initRecycler();
    getProduct()
}

private fun getProduct() {
    dataPresenter = DataPresenter(applicationContext,this)
    dataPresenter.getProduct()
}

private fun initRecycler() {
    productAdapter = ProductAdapter(this,productList)
    rvMain.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
    rvMain.adapter = productAdapter
}

override fun showLoading() {
    pgMain.visibility = View.VISIBLE
}

override fun hideLoading() {
    pgMain.visibility = View.GONE
}

override fun showProduct(products: List<ProductData>?) {
    if (products?.size != 0){
        this.productList.clear()
        this.productList.addAll(products)  // <= Required Iterable<ProductData>, Found List<ProductData>
        productAdapter.notifyDataSetChanged()
    }
}
  

}

Комментарии:

1. Я не слишком разбираюсь в kotlin, но я бы не удивился, что у него есть какой-то метод с именем iterator или похожий на это. Iterable это интерфейс, который означает, что все, что вы передаете, должно реализовывать такой интерфейс, чтобы быть принятым.

Ответ №1:

Я подозреваю, что сообщение об ошибке на самом деле:

 Required Iterable<ProductData>, Found List<ProductData>?
  

Знак вопроса в конце — это не просто пунктуация. Это обнуляемый индикатор в Kotlin. List<ProductData> Не может быть null , но List<ProductData>? может. И я считаю, что для этого addAll() требуется не- null значение.

В идеале вы должны изменить ProductView так, чтобы подпись для showProduct() была fun showProduct(products: List<ProductData>) .

В качестве альтернативы вы могли бы переписать showProduct() , чтобы быть:

 override fun showProduct(products: List<ProductData>?) {
    if (products?.size != 0){
        this.productList.clear()
        products?.let { this.productList.addAll(it) }
        productAdapter.notifyDataSetChanged()
    }
}