问题描述
我正在为一个问题而苦苦挣扎。我有一个带有图像的RecyclerView的活动。 RecyclerView通过适配器填充,并且工作正常,我得到了他的起始屏幕。
此后,我想以2秒的暂停间隔随机更改此图像。那是我需要帮助的地方,因为我已经尝试过,立即显示了结束屏幕,两次图像更改之间存在时间,这就是显示的内容。
我正在尝试通过调用hideElements()函数的onStart函数来实现这一点。 这是我的hideElements()函数:
private fun hideElements()
{
if(recyclerView.adapter?.itemCount == 0)
{
return
}
var hideOrdder: ArrayList<Int> = ArrayList<Int>()
for (i in 0 until recyclerView.adapter?.itemCount!!)
{
hideOrdder.add(i)
}
hideOrdder.shuffle()
for(i in hideOrdder)
{
_gridElementList[i].drawableId = R.drawable.kerojel
handler = Handler()
runnable = Runnable {
adapter!!.notifyItemChanged(i)
}
runOnUiThread {
handler!!.postDelayed(runnable!!,10000)
}
}
}
我也尝试创建一个线程,但是失败了。 thnx
解决方法
您将在一次循环内更改整个数据集_gridElementList
。那是不对的。可以有多种解决方案。您可以使用handler
和Timer
。
与处理程序一起发布解决方案。它不是很优雅,但是应该可以完成工作。
我为处理程序设置了一个延迟呼叫,并在2秒后触发时设置了后续呼叫。
val list = ArrayList<Int>()
val hideOrder: ArrayList<Int> = ArrayList<Int>()
val handler=Handler()
val runnable = Runnable {
list[hideOrder[changeIndex]].drawableId=R.drawable.kerojel
adapter?.notifyItemChanged(hideOrder[changeIndex])
scheduleHideElements()
}
var changeIndex=-1
private fun scheduleHideElements() {
if(changeIndex<hideOrder.size){
changeIndex++
handler.postDelayed(runnable,2000)
}
}
您需要预先在课程级别保存hideOrder
。这应该工作。它不是完整的代码,但您可以理解。确保确保在handler.removeCallbacks(runnable)
中呼叫onDestroy()
。
override fun onStart()
{
putElements()
var hideOrderList: ArrayList<Int> = hideOrderList()
object : CountDownTimer((settings.row * settings.column * settings.speed * 1000).toLong(),(settings.speed * 1000).toLong())
{
override fun onTick(miliSeconds: Long)
{
if (changeIndex < settings.row * settings.column)
{
_gridElementList[hideOrderList[changeIndex]].drawableId = R.drawable.kerojel
adapter!!.notifyItemChanged(hideOrderList[changeIndex])
changeIndex++
}
}
override fun onFinish()
{
Toast.makeText(this@GameActivity,"START",Toast.LENGTH_SHORT)
.show()
}
}.start()
startCounter()
super.onStart()
}