Android Kotlin在RecyclerView中更改ImageView图像源

问题描述

我正在为一个问题而苦苦挣扎。我有一个带有图像的RecyclerView的活动。 RecyclerView通过适配器填充,并且工作正常,我得到了他的起始屏幕。

start screen

此后,我想以2秒的暂停间隔随机更改此图像。那是我需要帮助的地方,因为我已经尝试过,立即显示了结束屏幕,两次图像更改之间存在时间,这就是显示内容

result screen

我正在尝试通过调用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。那是不对的。可以有多种解决方案。您可以使用handlerTimer。 与处理程序一起发布解决方案。它不是很优雅,但是应该可以完成工作。 我为处理程序设置了一个延迟呼叫,并在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()
    }