我有List<Presenter> presenterList;
用
public class Presenter(){
String name;
String imageRef; // Filename to be downloaded
Bitmap image;
(etc...)
}
我正在使用AsyncTask&amp;一旦图像下载完毕,我希望浏览列表并将Image值设置为新下载的图像。 到目前为止我有
Presenter pres = PresenterList.get(Position);
pres.Image = new (Bitmap) downloadedImageFromImageRef;
但是我担心这与列表中的演示者的图像值无关。
如何引用,甚至分配给列表中的特定Presenter属性?
从使用C(多年前)开始,我相信某事物就像指向要分配的值的指针.Image会起作用
谢谢你的推荐
答案 0 :(得分:2)
好吧,如果你有C经验,那么了解Java的一点是它不使用指针,但确实使用了引用。因此,如果我正确理解您的问题,您已经在其他地方使用了Image
实例的Presenter
属性,那么您希望稍后填写它。在这种情况下,分配pres.Image = new (Bitmap) DownloadedImageFromImageRef;
将不起作用,因为其他对象正在查看不同的Bitmap
对象引用。
您可能需要做的是使用观察者模式 - 这取决于您的问题的详细信息。这是一个例子:
在代码的某处,我有一个类Foo
,希望使用Image
实例中的Presenter
属性。但是,由于该属性直到稍后才设置,因此该类希望在准备就绪时得到通知(它是观察者)。
public class Presenter {
String Name;
String ImageRef; // Filename to be downloaded
private Bitmap Image;
private PresenterImageObserver observer;
public void setImageObeserver(PresenterImageObserver pio) {
this.observer = pio;
}
public void setImage(Bitmap b) {
this.Image = b;
this.observer.imageLoaded(b);
}
}
public interface PresenterImageObserver {
public void imageLoaded(Bitmap b);
}
public class Foo implements PresenterImageObserver {
//Foo's constructor. It wants the image from presenter p, when it is ready
public Foo(Presenter p) {
p.setImageObserver(this);
}
public void imageLoaded(Bitmap b) {
//b contains the loaded image and this Foo instance can use it now!
}
}
您需要使用pres.setImage(new (Bitmap) downloadedImageFromImageRef);
设置图片。
答案 1 :(得分:1)
因此,您必须在列表中找到正确imageref的Presenter
。你基本上有两种选择。
首先,您只需遍历列表
for (Presenter presenter: presenterList) {
if (presenter.imageref.equals(imageName) {
Presenter.image = new Bitmap(downloadedImage);
break; // found : stop iterations
}
}
其次,您可以为您的演示者创建HashMap
,并将imageref作为关键字:
HashMap<String, Presenter> map = new HashMap<>();
for (Presenter presenter: presenterList) {
map.put(presenter.imageref, presenter);
}
然后,您可以通过map.get(imageName)