Java 如何从随机化arraylist中知道最后一次使用的drawable是什么?
我有2个列表,一个用于ImageView的数组和一个用于Drawable的数组:Java 如何从随机化arraylist中知道最后一次使用的drawable是什么?,java,android,random,Java,Android,Random,我有2个列表,一个用于ImageView的数组和一个用于Drawable的数组: List<Integer> imageViews = new ArrayList<Integer>(); List<Integer> images = new ArrayList<Integer>(); 现在,当我点击一个特定的星号(或者可以是onCreate方法中的星号)时,它应该相应地随机化 可在随机图像视图中随机绘制: View.OnClickList
List<Integer> imageViews = new ArrayList<Integer>();
List<Integer> images = new ArrayList<Integer>();
现在,当我点击一个特定的星号(或者可以是onCreate方法中的星号)时,它应该相应地随机化
可在随机图像视图中随机绘制:
View.OnClickListener tapHandler = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
imageadd();
viewadd();
Random rng = new Random();
List<Integer> generated = new ArrayList<Integer>();
for (int i = 0; i < 12; i++)
{
while(true)
{
Integer next = rng.nextInt(imageViews.size()) ;
if (!generated.contains(next))
{
generated.add(next);
ImageView iv = (ImageView)findViewById(imageViews.get(next));
iv.setImageResource(images.get(next));
images.remove(next);
imageViews.remove(next);
break;
}
}
}
}
};
View.OnClickListener tapHandler=new View.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
//TODO自动生成的方法存根
imageadd();
视图添加();
随机rng=新随机();
生成的列表=新的ArrayList();
对于(int i=0;i<12;i++)
{
while(true)
{
整数next=rng.nextInt(imageViews.size());
如果(!generated.contains(下一步))
{
已生成。添加(下一步);
ImageView iv=(ImageView)findViewById(ImageView.get(next));
iv.setImageResource(images.get(next));
图像。删除(下一步);
imageview.remove(下一步);
打破
}
}
}
}
};
所以我想知道for循环中最后一个可绘制的是什么,这样我就可以在其中设置标记了?只要在循环外保留对最后一个
ImageView
的引用即可
// last image reference
Drawable lastImg = null;
List<Integer> generated = new ArrayList<Integer>();
for (int i = 0; i < 12; i++) {
while (true) {
Integer next = rng.nextInt(imageViews.size());
if (!generated.contains(next)) {
generated.add(next);
ImageView iv = (ImageView) findViewById(imageViews
.get(next));
iv.setImageResource(images.get(next));
// skip when i = 0
if (lastImg != null) {
iv.setTag(lastImg); // tag the last drawable
}
// store the current drawable
lastImg = getResources().getDrawable(images.get(next));
images.remove(next);
imageViews.remove(next);
break;
}
}
}
//上次图像引用
可绘制的lastImg=null;
生成的列表=新的ArrayList();
对于(int i=0;i<12;i++){
while(true){
整数next=rng.nextInt(imageViews.size());
如果(!generated.contains(下一步)){
已生成。添加(下一步);
ImageView iv=(ImageView)findViewById(ImageView
.得到(下一个);
iv.setImageResource(images.get(next));
//当i=0时跳过
if(lastImg!=null){
iv.setTag(lastImg);//标记最后一个可绘制的
}
//存储当前可提取数据
lastImg=getResources().getDrawable(images.get(next));
图像。删除(下一步);
imageview.remove(下一步);
打破
}
}
}
而且,除非它有其他用途,否则您也可以只调用一次
imageadd()
和viewadd()
,而不是每次调用onClick()
。您只需跳过调用images.remove()
和imageview.remove()
即可。那么,上次使用的imageview的值不会是iv吗?不会,因为iv
是循环的本地值,即在循环结束时被清除。另外,每次迭代都会通过调用findViewById()
重新初始化。如果您想重用它(冒着代码可读性差的风险),可以将其移出循环以增加其范围。然后,setTag()
调用应该在findViewById()
之前。尝试了你的代码并“toast ed”了lastView的值,我得到了如下值:android.widget.ImageView{…app:id/star11}。它显示的ImageView比我要的可绘制图像更多。啊,好的,我知道了。看看更新。它现在在当前的ImageView
上标记最后一个Drawable
。我现在正在获取Drawable,它显示类似于android.graphics.Drawable的内容。BitmapDrawable@xxxxx但最后一件事是,我能否获得与它们命名为'R.drawable.xxxx'相同的标识符?
// last image reference
Drawable lastImg = null;
List<Integer> generated = new ArrayList<Integer>();
for (int i = 0; i < 12; i++) {
while (true) {
Integer next = rng.nextInt(imageViews.size());
if (!generated.contains(next)) {
generated.add(next);
ImageView iv = (ImageView) findViewById(imageViews
.get(next));
iv.setImageResource(images.get(next));
// skip when i = 0
if (lastImg != null) {
iv.setTag(lastImg); // tag the last drawable
}
// store the current drawable
lastImg = getResources().getDrawable(images.get(next));
images.remove(next);
imageViews.remove(next);
break;
}
}
}