Моя позиция Recyclerview всегда дает мне «-1» - PullRequest
0 голосов
/ 08 октября 2019

Я использую модификацию для сбора данных и распечатки моего рециркулятора. Я просто хочу, чтобы, когда я нажимал на любую строку, открывалась новая активность. Но я видел в журналах, значения позиции всегда "-1". Я не могу найти какое-либо решение. У вас есть какие-либо идеи по этому поводу? Скриншот этого журнала: enter image description here

Это моя основная деятельность:

class MainActivity : AppCompatActivity(),MyItemClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ApiClient.client?.create(ApiInterface::class.java)?.tumModelleriGetir()
            ?.enqueue(object : Callback<List<AracModel>> {
                override fun onFailure(call: Call<List<AracModel>>, t: Throwable) {
                    Log.e("hata", "" + t?.printStackTrace())
                }
                override fun onResponse(
                    call: Call<List<AracModel>>,
                    response: Response<List<AracModel>>
                ) {
                    Log.e("başarılı", call?.request().url()?.toString())
                    var gelenData = response?.body()
                    var modellist= ArrayList(response.body()!!)
                    rv.layoutManager=LinearLayoutManager(this@MainActivity,LinearLayoutManager.VERTICAL,false)
                    rv.adapter=ModelAdapter(modellist,this@MainActivity)
                    //for (i in 0..response?.body()?.size!! - 1)
                      //  Log.e("başarılı", "" + response?.body()?.get(i)?.model.toString())
                } }) }

    override fun userItemClick(position: Int) {

        Log.e("pozisyon","pozisyon: "+position)
        when(position){

            3->{
                Toast.makeText(this,"deneme",Toast.LENGTH_SHORT).show()
            }
        }
    }
}

Это мой адаптер:

class ModelAdapter(var modelliste: List<AracModel>, var context: Context) :
    RecyclerView.Adapter<ModelAdapter.AracModelViewHolder>() {
    private val itemClickListener = context as MyItemClickListener
    //var modellist = ArrayList(response.body()!!)

    var modellist = modelliste
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracModelViewHolder {

        var inflater = LayoutInflater.from(parent.context)
        var teksatirmodel = inflater.inflate(R.layout.tek_satir_model, parent, false)


        var opelViewHolder = AracModelViewHolder(teksatirmodel)
        teksatirmodel.setOnClickListener {
            itemClickListener.userItemClick(opelViewHolder.adapterPosition)
        }
        return AracModelViewHolder(teksatirmodel)
    }

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

    override fun onBindViewHolder(holder: AracModelViewHolder, position: Int) {
        val oAnolusturulanSatir = modellist.get(position)
        holder.setData(oAnolusturulanSatir, position)
    }
    class AracModelViewHolder(viewGroup: View) : RecyclerView.ViewHolder(viewGroup) {
        var teksatirliste = itemView as CardView
        var modeltitle = teksatirliste.tvListeBaslik

        fun setData(modelliste: AracModel, position: Int) {

            modeltitle.text = modelliste.model }
    }
}

Ответы [ 4 ]

2 голосов
/ 08 октября 2019

Просто измените этот код, как показано ниже

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracModelViewHolder {
        var inflater = LayoutInflater.from(parent.context)
        var teksatirmodel = inflater.inflate(R.layout.modal_layout, parent, false)

        var opelViewHolder = AracModelViewHolder(teksatirmodel)
        teksatirmodel.setOnClickListener {
            itemClickListener.userItemClick(opelViewHolder.adapterPosition)
        }
        return opelViewHolder
    }

return opelViewHolder вместо AracModelViewHolder(teksatirmodel) новый объект

0 голосов
/ 08 октября 2019

Вы должны связать свой вызов с clickListener в onBindViewHolder вместо onCreateViewHolder, поскольку элементы могут быть переработаны, а позиция указана в параметрах.

override fun onBindViewHolder(holder: AracModelViewHolder, position: Int) {
        val oAnolusturulanSatir = modellist.get(position)
        holder.setData(oAnolusturulanSatir, position)
        holder.itemView.setOnClickListener {
               itemClickListener.userItemClick(position)
        }
}
0 голосов
/ 08 октября 2019

Вы можете попробовать, как показано ниже.

class ModelAdapter(var modelliste: List<AracModel>, var context: Context) :
    RecyclerView.Adapter<ModelAdapter.AracModelViewHolder>() {
    private val itemClickListener = context as MyItemClickListener
    //var modellist = ArrayList(response.body()!!)

    var modellist = modelliste
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracModelViewHolder {

        var inflater = LayoutInflater.from(parent.context)
        var teksatirmodel = inflater.inflate(R.layout.tek_satir_model, parent, false)

        return AracModelViewHolder(teksatirmodel)
    }

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

    override fun onBindViewHolder(holder: AracModelViewHolder, position: Int) {
        val oAnolusturulanSatir = modellist.get(position)
        holder.setData(oAnolusturulanSatir, position)
        // her you can set click listener on your item view
        holder.itemView.setOnClickListener {
            itemClickListener.userItemClick(position)
        }
    }
    class AracModelViewHolder(viewGroup: View) : RecyclerView.ViewHolder(viewGroup) {
        var teksatirliste = itemView as CardView
        var modeltitle = teksatirliste.tvListeBaslik

        fun setData(modelliste: AracModel, position: Int) {

            modeltitle.text = modelliste.model }
    }
}
0 голосов
/ 08 октября 2019

viewHolder.adapterPosition - это позиция на экране в пикселях, а не позиция в списке данных. И это не всегда актуально. Вы должны поместить var dataPosition в вашу реализацию держателя представления и установить в onBindView. Тогда используйте это в своем слушателе щелчка.

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