【问题标题】:Shuffling Gridview items without repeats tried many approaches无重复洗牌 Gridview 项目尝试了许多方法
【发布时间】:2013-04-08 22:58:00
【问题描述】:

我可能会失去生存的意愿。我一直在尝试编写一种方法来在使用 ImageAdapter 的 Gridview 上随机播放图像。我对Android没有经验。我已经访问了该站点上与无重复的洗牌数组有关的所有问题。我已经在普通的 Java 环境中测试了它们。有些工作没有重复。我尝试将数组更改为 Arraylist 并使用 Collections.shuffle。我仍然得到重复或模拟器已经崩溃。我真的很感激对此的一些见解-这可能很简单,但我无法理解。这是我的一些方法(使用我找到的代码)。

   public Integer[] myShuffleS(Integer []ji){

    ArrayList<Integer> numbers = new ArrayList<Integer>();   
    Random randomGenerator = new Random();
    while (numbers.size() < 36) {

        int random = randomGenerator.nextInt(35);
        if (!numbers.contains(random)) {
            numbers.add(random);

        }

    }  
    for (int i=0; i<ji.length;i++) {

        ji[i] =ji[numbers.get(i)] ;
    //  i++;
   }
    return ji;
}

另一个

        static int[] shuffleArray(int[] ar)
{
  Random rnd = new Random();
 int randomNo = rnd.nextInt()*3;
//  int randomNo = (int)Math.floor(Math.random() * 3);
  for (int i = ar.length - 1; i >= 0; i--)
  {
  //  int index = rnd.nextInt(i + 1);
      int index = randomNo - 1;
    // Simple swap
    int a = ar[index];
    ar[index] = ar[i];
    ar[i] = a;
  }

  return ar;
}

 public static void shuffleAArray(int[] a) {
   int n = a.length;
   int random = randomInt(0,35);
//  random.nextInt();
    for (int i = 0; i < n; i++) {
        int change = i + random;
       swap(a, i, change);
   }
}

另一个

  public Integer[] myShuffle( Integer[]jigX){
      boolean found = false;

for (int i = 0; i < jigX.length; i++) {
      do {

        found = false;
      int  temp = randomInt(0,35);
      jigX[i] = temp;
        for (int j = 0; j < i && !found; j++) { 
         if (jigX[j] == temp) 
             found = true;
        } 
      } 
      while (found);

      }

    return jigX;
    } 

还尝试了 Collections.shuffle 并放入下一块以获取图像

    myShuffleS(jigX);//or whatever method
 imageView.setImageResource(jigX [position]);

如果有人可以帮助解决这个问题,那就太好了!谢谢

【问题讨论】:

    标签: java android arrays shuffle


    【解决方案1】:

    好的,经过一番来回之后,看起来你的问题不在于洗牌本身。我猜你洗牌不止一次,这就是你得到重复条目的原因。制作一个可以随机播放其项目的自定义 ListAdapter。

    public class MyImageAdapter extends BaseAdapter {
        private Context mCtx;
        private List<Integer> mImages;
    
        public MyImageAdapter(final Context ctx, final List<Integer> images) {
            mCtx = ctx;
            mImages = images;
        }
    
        public void shuffle() {
            Collections.shuffle(mImages, new Random(System.currentTimeMillis()));
        }
    
        @Override
        public int getCount() {
            return mImages.size();
        }
    
        @Override
        public Object getItem(final int position) {
            return mImages.get(position);
        }
    
        @Override
        public long getItemId(final int position) {
            return 0;
        }
    
        @Override
        public View getView(final int position, final View convertView, final ViewGroup parent) {
            ImageView iv = (ImageView) convertView;
            if (iv == null) {
                iv = new ImageView(mCtx);
            }
    
            iv.setImageResource(mImages.get(position));
    
            return iv;
        }
    }
    

    在您的活动中按如下方式使用它:

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
    
        List<Integer> images = new ArrayList<Integer>();
        images.add(R.drawable.image1);
        images.add(R.drawable.image2);
        images.add(R.drawable.image3);
        ...
        GridView gv = (GridView) findViewById(R.id.grid_view);
        mAdapter = new MyImageAdapter(this, images);
        gv.setAdapter(mAdapter);
        ...    
        mAdapter.shuffle();
        mAdapter.notifyDataSetChanged();
    }
    

    这就是你要找的吗?

    【讨论】:

    • 感谢您的回复 Simon说我已经尝试了很多次,但我会再试一次 - 尽管明天
    • 谢谢 SimonSays 但它仍然重复
    • 只要输入数组没有重复的数字,使用此方法输出数组也不会有任何重复数字。如果输入数组可以包含重复的数字,那么您需要先过滤它们。您可以使用 Set 作为示例。
    • 我不知道你的问题是什么。上面的代码工作正常。输入数组 (ia[]) 包含从 0 到 9 的数字并被打乱。没有重复的数字。如果这对您不起作用,那么您需要更具体地说明问题所在。
    • 问题是那是一个数字数组 - 我需要洗牌的数组是图像对象的整数数组如果我尝试使用数字数组访问这些对象,我将一无所获用于访问图像的方法是
    【解决方案2】:

    如果 Collections.shufle 以某种方式失败了:

    1. 将你的整数放入 Set,

    2. 使用 random.nextInt(set.size()-1) 将它们一一获取。

    3. 将取出的内容添加到新的 Arraylist。

    4. 继续直到集合为空。

    保证没有双打。

    【讨论】:

    • 感谢您的回复,但仍然不高兴:-)
    • 那我认为你的问题不在于你的洗牌机制。你怎么能说它不起作用?你打印出洗牌的结果并看到双打吗?或者你只是看你的图像?也许错误在其他地方。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多