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 保存到具有全分辨率图像的文件