我有一个带有许多嵌套 LinearLayout 和 TextViews 的 LinearLayout
我的主要活动是主 LinearLayout 的膨胀,
然后,我从服务器加载数据,并根据收到的数据,在占位符中添加多个布局(LinearLayout)
这是一个简单的新闻页面,我在其中加载与新闻相关的图像并将其放置在最初为空的 LinearLayout 中。
每个图像都有以下信息:标题(TextView),日期(TextView),图像(ImageView)所以我实际做的是以下内容:
*请注意,这只是我在问题中编码的基本内容,我列举了所有 try -> catch ... if/else ....etc
public void addImages(JSONArray images){
ViewGroup vg = (ViewGroup) findViewById(R.id.imagesPlaceHolder);
// loop on images
for(int i =0;i<images.length;i++){
View v = getLayoutInflater().inflate(R.layout.image_preview,vg);
// then
I think that here is the problem
ImageView imv = (ImageView) v.findViewById(R.id.imagePreview);
TextView dt = (TextView) v.findViewById(R.id.dateHolder);
TextView ttl = (TextView) v.findViewById(R.id.title);
// then
dt.setText("blablabla");
ttl.setText("another blablabla");
// I think the problem is here too, since it's referring to a single image
imv.setTag( images.getJSONObject(i).getString("image_path").toString() );
// then Image Loader From Server or Cache to the Image View
}
}
上面的代码适用于单个图像
但对于多个图像,图像加载器不起作用,我猜这是因为所有 ImageView(多次膨胀)都具有相同的 ID
当您提供要用作父级的 ViewGroup 时,返回的 Viewinflate()
这位家长是(vg
在你的情况下)而不是新创建的视图。所以,v
指向 ViewGroupvg
而不是针对新创建的视图,因为您所有的孩子都有相同的id
,相同的子视图(imv
, dt
, ttl
) 每次都会返回。
两种解决方案。第一个是改变他们的id
完成它们之后,在下一次迭代之前。因此,在下一次迭代开始时的下一次创建中,新创建的视图将具有与旧视图不同的 ID,因为它们仍将使用定义在中的旧常量R
.
另一种解决方案是将参数 false 添加到对 inflate() 的调用中,以便新创建的视图不会附加到 ViewGroup,然后由 inflate() 函数而不是 ViewGroup 返回。然后,其余代码将按预期工作,但您必须在迭代结束时将它们附加到 ViewGroup。
请注意,您仍然需要提供一个 ViewGroup,因为它将用于确定 LayoutParams 的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)