Android - 具有 imageView 属性的对象数组

Posted

技术标签:

【中文标题】Android - 具有 imageView 属性的对象数组【英文标题】:Android - Array of objects with imageView attribute 【发布时间】:2016-01-05 04:51:02 【问题描述】:

我想创建一个具有 ImageView 属性的 Node 对象的 ArrayList。每个对象都有一个与之关联的不同图标,该图标位于 imageview 内部。 我创建了一个新的 imageview 并为其分配了一个图像资源,然后创建了一个包含该 imageview 的新节点对象。 然后我将另一个图像资源分配给我创建的图像视图,并使用这个“新”图像视图创建另一个节点对象。认为这会给我 2 个具有不同图标的节点对象。

这是我的代码:

ImageView imageview = new ImageView(this);
imageview.setImageResource(R.drawable.icon1);
Node node1 = new Node(imageview, "some text", "some more text");

imageview.setImageResource(R.drawable.icon2);
imageview.setTag(R.drawable.light_kidney_ore);
Node node2 = new Node(imageview, "some text", "some more text");

nodes = new ArrayList<Node>();
nodes.add(node1);
nodes.add(node2);

如果我这样做,两个节点对象都会得到相同的图标。

我知道问题在于节点对象内部的 imageview 只是引用了相同的 imageview,这就是为什么两个对象具有相同的图标(我放在 imageview 中的最后一个)。

我当然可以制作第二个 ImageView 并将其用作第二个图标,但鉴于我需要在我的数组中放置 50 个节点,我不想为每个节点对象制作一个新的 ImageView。

我自己应该真的能够找到解决方案,但目前似乎找不到。你可能已经猜到了,我不是一个很有经验的程序员

有人可以为我的问题提供解决方案吗?

我可以像第一个评论者所说的那样使用 int ID 而不是 ImageView,但后来我遇到了另一个问题。我使用适配器将这些节点对象添加到 ListView。

public class NodeAdapter extends ArrayAdapter 
List list = new ArrayList<>();

static class DataHandler 
    ImageView icon;
    TextView name;
    TextView location;
    TextView spawnTime;
    TextView slot;
    TextView rating;


public NodeAdapter(Context context, int resource) 
    super(context, resource);


@Override
public void add(Object object) 
    super.add(object);
    list.add(object);


@Override
public int getCount() 
    return this.list.size();


@Override
public Object getItem(int position) 
    return this.list.get(position);


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    View row;
    row = convertView;
    DataHandler handler;
    if (convertView == null)
        LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(getContext().LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.row_layout, parent, false);
        handler = new DataHandler();
        handler.icon = (ImageView)row.findViewById(R.id.imageViewNodeIcon);
        handler.name = (TextView)row.findViewById(R.id.textViewNodeName);
        handler.location = (TextView)row.findViewById(R.id.textViewNodeLocation);            
    
    else 
        handler = (DataHandler)row.getTag();
    

    NodeDataProvider dataProvider;
    dataProvider = (NodeDataProvider)this.getItem(position);
    handler.icon = dataProvider.getNodeIcon_resource();

    handler.name.setText(dataProvider.getNodeName_resource());
    handler.location.setText(dataProvider.getNodeLocation_resource());

    return row;
    

在这里,我需要向我的处理程序提供一个 ImageView,但我似乎找不到将我将使用的 id 转换回一个可用的 ImageView 以提供给我的处理程序的好方法。

【问题讨论】:

【参考方案1】:

好的,我解决了。我从来不需要一个 Imageview 来提供给我可以使用的处理程序:

handler.icon.setImageResource(dataProvider.getNodeIcon_resource());

我忽略了我可以设置 ImageResource 的事实,哈哈。

向 P.Melch 致敬。

【讨论】:

【参考方案2】:

为什么你需要创建一个 ImageView? 为什么不只将图像 id 存储在节点中。 然后,一旦您想实际使用 Node 来初始化某些布局,您只需创建/重用 ImageView 并设置资源 id。

【讨论】:

我试过了,这会奏效,但后来我遇到了另一个问题。如果您想在 5 分钟内查看一下,我会在我原来的问题中添加更多代码。 我刚刚更新了我原来的问题。如果您能给我一个将资源 id 转换回该位置的可用 ImageView 的好方法,我想我可以解决它。

以上是关于Android - 具有 imageView 属性的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Android课程---Android ImageView的scaleType属性与adjustViewBounds属性(转)

Android——ImageView的scaleType属性与adjustViewBounds属性 (转)二

Android——ImageView的scaleType属性与adjustViewBounds属性 (转)一

Android - 将 ImageView 保存到具有全分辨率图像的文件

Android ImageView(scaleType属性)

[转]Android ImageView的scaleType属性与adjustViewBounds属性