【发布时间】: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 以提供给我的处理程序的好方法。
【问题讨论】: