java - 随机排列 Gridview 项目而不重复尝试了多种方法

标签 java android arrays shuffle

我可能会失去活下去的意志。我一直在尝试编写一种方法来在使用 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 并放入下一 block 来获取图像

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

如果有人能帮忙解决这个问题那就太好了!谢谢

最佳答案

好吧,经过一番来回,看起来你的问题不是洗牌本身。我猜你洗牌不止一次,这就是你得到重复条目的原因。制作一个可以随机排列其项目的自定义 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;
    }
}

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

@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();
}

这就是你要找的吗?

关于java - 随机排列 Gridview 项目而不重复尝试了多种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890493/

相关文章:

Java 未签名 Applet - 传递 VM 参数 "java.security.policy"被忽略?

java - Netbeans 创建的项目没有 glassfish-web.xml

java - 无法使用 SAXFilter 删除 SOAP 响应的命名空间

android - 用于显示 PDF 页面的 ViewPager

android - YouTubePlayerFragment 可以在 ViewPager 中使用吗?如果没有替代方案?

Android Webview NullPointerException

python - SQLAlchemy/PostgreSQL 可变、去重数组

Java JAXB 编码到 DOM 文档

ios - Swift 3 For 循环比较和更改

arrays - 当屏幕上的数据正常时,获取 "System.Collections.Generic.List` 1[System.String]"在 CSV 文件导出中