kotlin выбирает между 2 imageview n раз, используя цикл for

#android #android-studio #kotlin

#Android #android-studio #kotlin

Вопрос:

как я могу заставить пользователя выбирать (нажав на изображение) между 2 изображениями n раз, используя цикл for?

ниже я создал массив из 4 рисуемых изображений и установил для него значение rank2. в каждом цикле пользователь выбирает одно из 2 изображений, затем выбранное изображение сохраняется в массиве rank1. поскольку сейчас есть только 4 чертежа, он будет повторяться только 2 раза.

 val imageView1 = findViewById<ImageView>(R.id.imageView1);
val imageView2 = findViewById<ImageView>(R.id.imageView2);
val textView = findViewById<TextView>(R.id.textView);

var rank2 = mutableListOf(R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4)
val rank1: MutableList<Int> = ArrayList()

var x = 0;
while(x<2) {//run it 2 times
  var temp = arrayOf(rank2[x*2], rank2[(x*2) 1]);

  imageView1.setImageResource(temp[0]);
  imageView2.setImageResource(temp[1]);

  imageView1.setOnClickListener{
    rank1.add(temp[0]);
    x  ;
  }
  imageView1.setOnClickListener{
    rank1.add(temp[1]);
    x  ;
  }
}
 

но этот попадает в бесконечный цикл.
как я могу это исправить?

Ответ №1:

Нет необходимости использовать while цикл. Все, что вам нужно, — это счетная переменная.

 var rank2 = mutableListOf(R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4)
val rank1: MutableList<Int> = ArrayList()

imageView1.setImageResource(rank2[0]);
imageView2.setImageResource(rank2[1]);

var x = 0

imageView1.setOnClickListener{
  if (x < 2) {
    rank1.add(rank2[2 * x])
    imageView1.setImageResource(rank2[2 * (x   1)])
    imageView2.setImageResource(rank2[2 * (x   1)   1])
    x  
  }
}
imageView2.setOnClickListener{
  if (x < 2) {
    rank1.add(rank2[2 * x   1])
    imageView1.setImageResource(rank2[2 * (x   1)])
    imageView2.setImageResource(rank2[2 * (x   1)   1])
    x  
  }
}
 

Ответ №2:

Попробуйте создать рекурсивный метод вместо цикла, который вызывает себя nLoops раз. Попробуйте что-то вроде этого:

 fun c(b: Int, nLoops: Int) {
    if (b!=nLoops) {
        var x = b;
        var temp = arrayOf(rank2[x * 2], rank2[(x * 2)   1]);

        imageView1.setImageResource(temp[0]);
        imageView2.setImageResource(temp[1]);

        imageView1.setOnClickListener
        {
            rank1.add(temp[0]);
            x  ;
            c(x, nLoops);
        }
        imageView1.setOnClickListener
        {
            rank1.add(temp[1]);
            x  ;
            c(x, nLoops);
        }
    }
}
 

Когда вы запускаете что-то вроде этого с b = 0 и nLoops = 2, он выполнит ваш код только после того, как вы нажмете изображение 2 раза.