有没有办法暂时在ImageView中保存ImageView?

时间:2018-02-02 17:16:45

标签: java android imageview

我正在尝试在我的程序中执行以下操作

ImageView temp = new ImageView(this);  //initialize beforehand somewhere in the program

ArrayList<Photos> photos = new ArrayList<Photos>(); //Photos has an ImageView that can be set via constructor

callBackMethod(YoutubeThumbnailView source){
    temp.setImageDrawable(source.getDrawable());
    photos.add(new Photo(temp));      //or just do photos.add(new Photo(source)) directly
    aMethodThatCallsThisMethodAgain();
}

在Photos ArrayList中的每个位置都会发生一个带有最后一个youtubeThumbnailView的photo()。

当我检索它时,所有位置都具有相同的ImageView。

每次我使用独特的临时ImageView时,它只存储不同的ImageView。

e.g。 temp1.setImageDrawable(source.getDrawable()); temp2.​​setImageDrawable(source.getDrawable()); temp3.setImageDrawable(source.getDrawable()); ..........

等等。

为什么会这样?

2 个答案:

答案 0 :(得分:0)

由于递归,它当然会将imageview src设置为最后一个更新为变量名,包括引用是相同的

当你插入临时imageview时,它的引用被存储到新照片(temp)初始化而不是完整变量。由于整个arraylist对象具有与引用相同的temp,我的意思是你所有的imageviews都通过新照片()方法只是指向内存中的相同临时变量,因此对temp的任何更改都会导致所有图像视图的更改,您可以测试并查看

您可以参考stackoverflow上的硬拷贝/软拷贝来更好地理解这一点 我建议你创建一个新的图像视图arraylist并通过索引

引用它们到你的照片构造函数
ArrayList<Photos> photos = new ArrayList<Photos>(); //Photos has an ImageView that can be set via constructor

callBackMethod(YoutubeThumbnailView source){
ImageView temp = new ImageView(this);  //initialize beforehand somewhere in the program
temp.setImageDrawable(source.getDrawable());
photos.add(new Photo(temp));      //or just do photos.add(new Photo(source)) directly
aMethodThatCallsThisMethodAgain();
}

答案 1 :(得分:0)

你所拥有的是一个“床头柜”,里面有一个抽屉和一个蛋糕盒。

你所做的就是每一个你带着你扔掉旧的ccookies并填写新的ccookies。

相反,你应该得到一个带有许多抽屉的大型侧板,并在每次出现时在下一个空抽屉里放一个新的蛋糕盒。

转换为您的代码,这意味着您需要LocaleProjects Collection并在每次递归时添加一个新的ImageView对象。

  出于临时目的而使其变大的抽屉是不可取的不是吗?

这根本不可能。我的示例中的“抽屉”是列表中的位置。您只能在列表中的某个位置只有一个项目。坚固这个棘手的海湾是容器本身,例如另一个ImageViewCollection ...