Android : 自定义对象无法保留资源 ID

Android : Custom object can't preserve resource ID

应用程序在 Gridview 中显示图像。在 GridView 的适配器中,我从可用资源中随机生成 # of images reqd。创建了一个新的 Integer[] imageIDs 并且这些资源 ID 保存在这个新数组中。我还想将此 resourceID 存储在扩展 ImageView 的自定义对象 ImageSourceObjectArrayList 中。我使用 imgObj.setImageResource(imageIDs[i]) 设置 imageView。现在,当我在 onTouch()getView() 方法中检索此对象时,我希望获得与 imageView 集相同的资源,而我得到的是 -1。

我认为当我通过 setImageResource() 设置 ImageSourceObject 的 ImageView 时,然后当我尝试检索 ImageSourceObject 的 getId() 时,我应该获得 ImageView 集的 ID。

代码:

    private void createObjectsArray() {
    int totalObjs = 15;
    Integer[] mThumbIds = {
            R.drawable.droid_1, R.drawable.droid_3,
            R.drawable.droid_2, R.drawable.ic_launcher
    };
    // Create new [] for imageIDs to store the resource ID as generated    
    imageIds = new Integer[totalObjs];
    // Create ArrayList of ImageSourceObject to set image & other proeprties 
    this.imgObjsArr = new ArrayList<ImageSourceObject>();

    Random random = new Random();
    int index;
    // Set Targets 
    for (int i=0; i < totalObjs; i++) {
        index = this.generateRandomNumber(0, (mThumbIds.length - 1), random);
        imageIds[i] = mThumbIds[index];
        ImageSourceObject iso = new ImageSourceObject(mContext);
        iso.setImageResource(imageIds[i]);
        imgObjsArr.add(iso);

        Log.d("GA", "ThumbIDS ID : " + mThumbIds[index] + " ImageIDs  : " + imageIds[i] + " ISO IMG ID : " + iso.getId());
    }
}

此代码的日志:

02-19 12:21:38.780: D/GA(1613): ThumbIDS ID : 2130837557 ImageIDs  : 2130837557 ISO IMG ID : -1

可以看到mThumbIDsimageIDs值的ID是一样的。但是对于设置图像后的 iso 对象也是 -1 ??

ImageSourceObject 的代码非常简单:

public class ImageSourceObject extends ImageView {

private boolean touched;
private boolean targetObj;

public ImageSourceObject(Context context) {
    super(context);
    setTouched(false);
    setTargetObj(false); 
}

 .... Rest Getter & Setter methods

你能帮我知道为什么 ImageSourceObject 中没有设置资源 ID 吗?通过 ImageViewsetImageResource 设置图像不保存所有资源吗???

非常感谢任何帮助。

谢谢

您需要使用 iso.setId(int) 来设置 Id

您提供的 id 是您填充到 ImageSourceObject(Drawable)的图像,它不是 ImageSourceObject 本身。 如果你想将id设置为这个数字,你应该这样做:

        iso.setImageResource(imageIds[i]);
        iso.setId(imageIds[i]);

对于像您的 ImageSourceObject 这样以编程方式创建的视图,您需要为其分配一个 id usign View.setId(int id)。

如果您使用的是 API 17 级或更高级别,您可以使用 View.generateViewId() 生成合适的值。根据documentation:

This value will not collide with ID values generated at build time by aapt for R.id.

无论如何,考虑到根据 documentation:

The identifier does not have to be unique in this view's hierarchy. The identifier should be a positive number.

因此,可能会与您的 ID 发生冲突,Android 将解决这些冲突,为您提供在层次结构中为给定 ID 找到的第一个组件。

使用 setTag(tag) 和 getTag() 方法设置您的对象:

iso.setTag(imageIds[i]); //to set the id to object

int tag=(Integer)iso.getTag();// to get the id from object