我正在实现一个显示从.net服务器获取的图像和消息的应用程序。为此,我使用for循环动态添加LinearLayout
TextView
和ImageView
。
起初我收到消息,我将它们添加到TextView
,虚拟图像放在ImageView
中:
for(int i = 0; i < messages.size(); i++) {
FrameLayout f1 = new FrameLayout(this);
LinearLayout l1 = new LinearLayout(this);
LinearLayout l2 = new LinearLayout(this);
im = new ImageView(this);
TextView tv = new TextView(this);
tv.setText(messages.get(i).getmessage());
im.setImageResource(R.drawable.person);
l1.addView(tv);
l2.addView(im);
f1.addView(l1);
f1.addView(l2);
((LinearLayout)findViewById(R.id.LinearlayoutMessage)).addView(f1);
}
一段时间后,我得到原始图像。我的目的是用原始图像替换虚拟图像。为了达到这个目的,我正在使用imageview.getid()
,不幸的是我正在使用imageview的最后一个ID。但我需要获得每个单独的imageview id。
使用真实图像更改虚拟图像的最佳方法是什么?
答案 0 :(得分:1)
看起来您需要将每个imageView ID存储在每条消息的地图中 - &gt; imageView如下:
Map<Message, Long> messageMapping = new HashMap<Message, Long>();
for(int i = 0; i < messages.size(); i++) {
FrameLayout f1 = new FrameLayout(this);
LinearLayout l1 = new LinearLayout(this);
LinearLayout l2 = new LinearLayout(this);
im = new ImageView(this);
TextView tv = new TextView(this);
//add mapping
messageMapping.put(messages.get(i), im.getId());
tv.setText(messages.get(i).getmessage());
im.setImageResource(R.drawable.person);
l1.addView(tv);
l2.addView(im);
f1.addView(l1);
f1.addView(l2);
((LinearLayout)findViewById(R.id.LinearlayoutMessage)).addView(f1);
}
然后,当您将图像延迟加载到现有的imageViews时,您只需要通过消息映射查找imageView id引用:
(您猜测代码的总体猜测)
for(int i = 0; i < messages.size(); i++){
Image image = queryServerForImage(messages.get(i).getImageId());
ImageView imageView = ((ImageView)findViewById(messageMapping.get(messages.get(i))));
//some conversion & seteup may be needed to get image into proper format
imageView.setImageBitmap(image);
}
您可以使用异步任务执行类似操作。您可以使用关联的资源ID跨越消息ImageView创建循环中的每一个,并让每个asyc任务更新网络响应中的ui。