我可能会失去生活的意志。我一直在尝试编写一种方法来在使用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]);
如果有人可以帮助我这将是伟大的!感谢
答案 0 :(得分: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();
}
这就是你要找的东西吗?
答案 1 :(得分:0)
如果Collections.shufle以某种方式失败了:
将整数放入Set,
使用random.nextInt(set.size() - 1)逐个获取它们。
将取出的内容添加到新的Arraylist中。
继续直到设置为空。
保证没有双打。