【问题标题】:Android Kotlin change ImageView image source in RecyclerViewAndroid Kotlin 更改 RecyclerView 中的 ImageView 图像源
【发布时间】:2020-10-18 11:39:50
【问题描述】:

我正在努力解决一个问题。我有一个带有图像的 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)
            }
        }
    }

我也尝试创建一个线程,但失败了。 谢谢

【问题讨论】:

    标签: android kotlin android-recyclerview android-thread


    【解决方案1】:

    您正在一次性更改整个数据集_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。这应该有效。它不是完整的代码,但你明白了。请务必在onDestroy() 中致电handler.removeCallbacks(runnable)。

    【讨论】:

      【解决方案2】:
      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()
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        相关资源
        最近更新 更多