簡體   English   中英

Android Kotlin 在 RecyclerView 中更改 ImageView 圖片源

[英]Android Kotlin change ImageView image source in RecyclerView

我正在努力解決一個問題。 我有一個帶有圖像的 RecyclerView 的活動。 RecyclerView 通過適配器填充,這很好用,我得到了他的起始屏幕。

開始畫面

在此之后,我想循環更改此圖像,並隨機暫停 2 秒。 這就是我需要幫助的地方,因為我已經嘗試過,立即顯示結束屏幕,兩次圖像更改之間有時間,這就是顯示的內容。

結果畫面

我試圖在 onStart 函數調用 hideElements() 函數中實現這一點。 這是我的 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)
            }
        }
    }

我也嘗試創建一個線程,但失敗了。 謝謝

您正在循環內_gridElementList更改整個數據集_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 這應該有效。 它不是完整的代碼,但你明白了。 請確保在onDestroy()調用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()
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM