【问题标题】:Type mismatch: inferred type id <no name provided> but OnProdukItemClickListener was expected类型不匹配:推断类型 id <未提供名称> 但应为 OnProdukItemClickListener
【发布时间】:2020-05-04 16:32:36
【问题描述】:

所以我正在制作一个简单的类似市场的程序,其中数据库来自 MySQL,在这个项目中,我在 recyclerView 上添加了 onClick 函数,它将用户带到产品的详细信息

MainActivity.kt

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.widget.LinearLayout
import android.widget.Toast
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.androidnetworking.AndroidNetworking
import com.androidnetworking.common.Priority
import com.androidnetworking.error.ANError
import com.androidnetworking.interfaces.JSONObjectRequestListener
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.produk_list.*
import org.json.JSONObject

class MainActivity : AppCompatActivity(), OnProdukItemClickListenener {
    lateinit var produklist: ArrayList<Produk>

    @SuppressLint("WrongConstant")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        produklist = ArrayList()

        val recyclerView = findViewById(R.id.recyclerView) as RecyclerView
        recyclerView.layoutManager= LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        recyclerView.addItemDecoration(DividerItemDecoration(this, 1))
        recyclerView.adapter = CustomAdapter(produklist, this)

        val produk=ArrayList<Produk>()

        AndroidNetworking.post("http://192.168.100.8/farminc/freshproduk.php")
            .setPriority(Priority.MEDIUM)
            .build()
            .getAsJSONObject(object : JSONObjectRequestListener {
                override fun onResponse(response: JSONObject) {

                    val jsonArray = response.getJSONArray("result")
                    for (i in 0 until jsonArray.length()) {
                        val jsonObject = jsonArray.getJSONObject(i)

                        var idPrdk = jsonObject.optString("id_produk").toString()
                        var imagePrdk =jsonObject.optString("image").toString()
                        var namaPrdk = jsonObject.optString("nama_produk").toString()
                        var hargaPrdk = jsonObject.optString("harga").toString()

                        produk.add(Produk("$idPrdk", "$imagePrdk", "$namaPrdk", "$hargaPrdk"))

                    }
                    recyclerView.adapter = CustomAdapter(produklist, this) ***<--problem source***
                }

                override fun onError(error: ANError) { // handle error
                }

            })
    }

    override fun onItemClick(produk: Produk, position: Int) {
        Toast.makeText(this, produk.nama_produk, Toast.LENGTH_SHORT).show()

    }
}

CustomAdapter.kt

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.produk_list.view.*

class CustomAdapter (var produk: ArrayList<Produk>, var clickListenener: OnProdukItemClickListenener):RecyclerView.Adapter<ProdukViewHolder>() {

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProdukViewHolder {
        val v=LayoutInflater.from(parent?.context).inflate(R.layout.produk_list, parent, false)
        return ProdukViewHolder(v)

    }

    override fun onBindViewHolder(holder: ProdukViewHolder, position: Int) {

        holder.initialize(produk.get(position), clickListenener)

    }

    interface OnProdukItemClickLictener {
        fun onItemClick(produk: Produk, position: Int)
    }

}

class ProdukViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var imagePrdk = itemView.imagePrdk
    var namaPrdk = itemView.namaPrdk
    var hargaPrdk = itemView.hargaPrdk

    fun initialize(produk: Produk, action: OnProdukItemClickListenener) {
        imagePrdk.text = produk.image
        namaPrdk.text = produk.nama_produk
        hargaPrdk.text = produk.harga

        itemView.setOnClickListener {
            action.onItemClick(produk, adapterPosition)
        }
    }
}

interface OnProdukItemClickListenener {
    fun onItemClick(produk: Produk, position: Int)
}

Produk.kt

data class  Produk(val id: String, val image : String, val nama_produk:String, val harga: String) {
}

问题的根源是 MainActivity 中的recyclerView.adapter = CustomAdapter(produklist, this),谢谢。

【问题讨论】:

  • 请提供堆栈跟踪并通过删除诸如导入之类的冗余部分来压缩您的代码。

标签: mysql android-studio kotlin


【解决方案1】:

您在 JSONObjectRequestListener 的实现内部调用它,它不是 OnProdukItemClickListenener 类型并使用 this 关键字引用它。

你应该指向 MainActivity 因为那是OnProdukItemClickListenener的实现

像这样:

recyclerView.adapter = CustomAdapter(produklist, this@MainActivity)

这称为Qualified this expressions,用于使用 this 关键字指向特定对象。

【讨论】:

  • 所以我必须更改的是 OnProdukItemListener 到 JSONObjectRequestListener,并添加 @MainActivity 对吗?
  • 还有一点我没有提到的是我有另一个活动(SearchActivity.kt)类似于主要活动,唯一的区别是另一个是搜索,所以我也必须在搜索中添加@SearchActivity?
  • @Luthfi Kusumajadi 你只需要添加@MainActivity
  • 无论this 关键字被某个子类覆盖,您都需要显式标记该对象。
  • 感谢我删除了所有错误,但是当我运行应用程序时,recyclerview 没有显示我数据库中的项目。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 2020-04-24
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多