【问题标题】:How to: Make addition to class property within list如何:在列表中添加类属性
【发布时间】:2014-06-06 15:36:10
【问题描述】:

我有一个List<Presenter> presenterList;

public class Presenter(){
  String name;
  String imageRef; // Filename to be downloaded
  Bitmap image;

  (etc...)
}

我正在使用 AsyncTask,一旦图像下载完成,我希望浏览列表并将图像值设置为新下载的图像。 到目前为止我有

Presenter pres = PresenterList.get(Position);
pres.Image = new (Bitmap) downloadedImageFromImageRef;

但我担心这与列表中演示者的 Image 值无关。

我如何引用,甚至分配给列表中的特定 Presenter 属性?

从使用 C (多年前)开始,我相信类似指向要分配 .Image 的值的指针这样的东西会起作用

谢谢你

【问题讨论】:

  • 目前尚不清楚您希望如何将图像与演示者相关联,是通过名称,还是您只是始终影响到列表中的最后一个演示者,或者从头开始或...?
  • 我的错误。使用一个名为 imageref 的属性来存储需要下载的实际图像文件名。有 2 个阶段,下载名称、图像参考和描述的数据。然后从 imageref 值下载图像并将位图存储到图像值。我将进行编辑。谢谢
  • 我正在迭代地处理列表
  • 次要注意:以大写字符(Pascal 大小写)开头的变量是不好的风格(并且会使其他 Java 开发人员感到困惑)。该外壳用于类/接口。

标签: java list class


【解决方案1】:

好吧,如果您有 C 经验,那么要了解 Java 的一点是它不使用指针,但确实使用引用。因此,如果我正确理解了您的问题,那么您已经在其他地方使用了 Presenter 实例的 Image 属性,然后您想稍后填写它。在这种情况下分配pres.Image = new (Bitmap) DownloadedImageFromImageRef; 将不起作用,因为其他对象正在查看不同的Bitmap 对象引用。

您可能需要做的是使用观察者模式——这取决于您的问题的细节。这是一个例子:

在代码的某处,我有一个类 Foo,它想要使用来自 Presenter 实例的 Image 属性。但是,由于该属性直到稍后才设置,因此此类希望在准备好时得到通知(它是一个观察者)。

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); 设置图像。

【讨论】:

    【解决方案2】:

    因此,您必须在列表中找到正确的 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)直接找到合适的演示者

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2021-06-20
      • 2021-12-18
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多