Как установить случайные изображения в ImageView? - PullRequest
3 голосов
/ 19 сентября 2011

Я использую 9 изображений. Я хочу, чтобы изображения отображались в случайном порядке, когда я нажимаю кнопку обновления, но я пытался вот так: он работает для случайного размещения изображений, но повторяет одно и то же изображение в двух (или) трех видах изображения в время. где проблема в моем коде ..

 final int[] imageViews = {
            R.id.imgview11, R.id.imgview12, R.id.imgview13, 
            R.id.imgview21, R.id.imgview22, R.id.imgview23, 
            R.id.imgview31, R.id.imgview32, R.id.imgview33 };

    final int[] images = {
            R.drawable.i1, R.drawable.i2, R.drawable.i3, 
            R.drawable.i4, R.drawable.i5, R.drawable.i6, 
            R.drawable.i7, R.drawable.i8, R.drawable.empty };

    final ImageButton shuffle = (ImageButton) findViewById(R.id.new_puzzle); 
    shuffle.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {        
            Random generator = new Random();
            //int n = 9;
            //n = generator.nextInt(n);
            //Random random = new Random(System.currentTimeMillis());
            for(int v : imageViews) {
                ImageView iv = (ImageView)findViewById(v);
                iv.setImageResource(images[generator.nextInt(images.length - 1)]);
            }
        }
    });      

Я не хочу повторяться, одно изображение только для одного просмотра ..

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

используя пост blessenm, я написал похожий код, который вам нужен.проверьте, поможет ли это вам.

shuffle.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) { 

            Random rng = new Random(); 
            List<Integer> generated = new ArrayList<Integer>();
            for (int i = 0; i < 9; i++)
            {
              while(true)
              {
                 Integer next = rng.nextInt(9) ;
                 if (!generated.contains(next))
                 {
                    generated.add(next);
                    ImageView iv = (ImageView)findViewById(imageViews[i]);
                    iv.setImageResource(images[next]);
                    break;
                 }
               }
            }
            }
        });
1 голос
/ 19 сентября 2011

Возможно, не идеальный ответ, но я бы просто перетасовал список изображений и установил результирующее изображение для просмотра изображений.

Это позволит избежать необходимости генерировать случайные числа, которые, конечно, будут создавать дубликатыбросьте кубик 6 раз, у вас не будет чисел 1,2,3,4,5,6 в случайном порядке, вы получите несколько раз одно и то же число.)

Пожалуйста, проверьте всевключая «я», поскольку я не перед своим компьютером.

List<int> list = Arrays.asList(images);
// Here we just simply used the shuffle method of Collections class
// to shuffle out defined array.
Collections.shuffle(list);

int i=0;
// Run the code again and again, then you'll see how simple we do shuffling
for (int picture: list) {
    ImageView iv = (ImageView)findViewById(imageViews[i]);
    iv.setImageResource(picture);
    i++;
}

в качестве альтернативы, вы также можете перетасовать свой список следующим кодом:

public class ShuffleArray {
    public static void shuffleArray(int[] a) {
        int n = a.length;
        Random random = new Random();
        random.nextInt();
        for (int i = 0; i < n; i++) {
            int change = i + random.nextInt(n - i);
            swap(a, i, change);
        }
    }

    private static void swap(int[] a, int i, int change) {
        int helper = a[i];
        a[i] = a[change];
        a[change] = helper;
    }

    public static void main(String[] args) {
        int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7 };
        shuffleArray(a);
        for (int i : a) {
            System.out.println(i);
        }
    }
}
0 голосов
/ 19 сентября 2011

Возможно, вы захотите сослаться на этот пост. Он показывает метод для генерации случайных чисел без дубликатов Создание случайных чисел без дубликатов

...