RecyclerView , котлин, задержка ответа на щелчок

#android #kotlin #android-recyclerview #interface

Вопрос:

Мир я сделал простой recyclerview, с интерфейсом ClickListener, состоящим из 4 элементов, показывающих тосты по щелчку. Он отлично работает, если я нажимаю один раз в секунду, но если я быстро нажимаю на разные элементы ( 2 или 3 раза за 1 секунду), он все равно показывает тост каждую секунду, не меняя его быстро

код класса данных:

     package com.elsersy.rv5

data class Items (var textt:String) {
}
 

код адаптера

 package com.elsersy.rv5

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView

class MyAdapter(private var stringList:ArrayList<Items>,private val listener:MyOnClickListener):
    RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
    inner class MyViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) {
        var text:TextView = itemView.findViewById(R.id.textView)

        init {
            itemView.setOnClickListener {
                val position = absoluteAdapterPosition
                if (position != RecyclerView.NO_POSITION)
                {
                    listener.onItemClick(position)
                }
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.row_item,parent,false)
        return MyViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = stringList[position]
        holder.text.text = currentItem.textt
    }

    override fun getItemCount(): Int {
        return stringList.size
    }
    interface MyOnClickListener{
        fun onItemClick(position: Int)
    }
    fun setData(newItemList:ArrayList<Items>){
        val diffUtil = MyDiffUtil(stringList,newItemList)
        val diffResults = DiffUtil.calculateDiff(diffUtil)
        stringList = newItemList
        diffResults.dispatchUpdatesTo(this)
    }
}
 

Код активности

     package com.elsersy.rv5

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import com.elsersy.rv5.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity(),MyAdapter.MyOnClickListener {
    private lateinit var binding: ActivityMainBinding
    private lateinit var stringList:ArrayList<Items>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        binding.recyclerView.layoutManager = LinearLayoutManager(this)
        stringList = arrayListOf<Items>()
        getStrings()
        binding.recyclerView.adapter=MyAdapter(stringList,this)
    }

    private fun getStrings() {
        for (a in 0..4){
            var string_Array = resources.getStringArray(R.array.string_array)
            stringList.add(Items(string_Array[a]))
        }
    }

    override fun onItemClick(position: Int) {
        Toast.makeText(this,"$position is clicked", Toast.LENGTH_SHORT).show()

    }
}
 

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

1. Что именно вы планируете делать с тостами ?

2. просто чтобы подтвердить, что clicklistener работает правильно, но даже если я увеличу щелчок на целое число на единицу, если я нажму много раз, он увеличится на единицу в секунду

Ответ №1:

Если вы хотите отменить предыдущий тост перед отображением нового, назначьте его в качестве переменной-члена и отмените его перед отображением нового:

 private var toast : Toast? = null
        ..
override fun onItemClick(position: Int) {
     toast?.cancel()
     toast = Toast.makeText(this,"$position is clicked", Toast.LENGTH_SHORT)
     toast?.show()
}
 

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

1. проблема не в самом тосте…. даже если я увеличу щелчок на целое число на единицу, если я нажму много раз, оно увеличится на единицу в секунду… я хочу знать, почему присутствует этот 1-секундный интервал

2. Если вы тестируете это поведение с тостами, тосты-это проблема, потому что тосты не заменяют предыдущие автоматически. (Это было бы той же проблемой, если бы вы показывали тосты, быстро нажимая на обычную кнопку) Вы проверяли с помощью журналов вместо этого? Я имею в виду записать позицию в журналы вместо того, чтобы показывать тост.

3. я протестировал его с помощью int .. onItemClick( количество ) .. количество кликов увеличивается на 1 в секунду,

4. хорошо, я постараюсь рассказать вам. спасибо за ответ

5. @MuhammadElsersy Я имею в виду заменить тост следующим: Log.d(«Основная активность», «нажата позиция$») и наблюдать за журналами. Или воспользуйтесь решением, которое я предложил для отмены предыдущих тостов.