#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(«Основная активность», «нажата позиция$») и наблюдать за журналами. Или воспользуйтесь решением, которое я предложил для отмены предыдущих тостов.