如何在一个膨胀的布局中使用相同的id膨胀多个布局的实例

我有一个LinearLayout与许多嵌套的LinearLayouts和TextViewss

我的主要活动膨胀主要LinearLayout,

然后我从服务器加载数据,并根据收到的数据,我添加了一个占位符(LinearLayout)的多个布局,

这是一个简单的新闻页面,我加载与新闻相关的图像,并将其放置在最初的空LinearLayout。

每个图像都有以下信息:标题(TextView),date(TextView),图像(ImageView),所以我实际上做的是以下内容:

* 请注意,这只是在我提到的所有尝试 – >抓住… if / else ….等问题的基本编码

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 } } 

上面的代码适用于单个图像

但是,对于多个图像的图像加载器不工作我想这是因为所有ImageViews(多次膨胀)具有相同的ID

Solutions Collecting From Web of "如何在一个膨胀的布局中使用相同的id膨胀多个布局的实例"

是否有一个原因,为什么布局XML中的ImageView需要一个ID? 你可以从image_preview.xml布局中清除android:id属性,然后只需迭代膨胀的LinearLayout的子元素? 例如:

 ViewGroup v = (ViewGroup)getLayoutInflater().inflate(R.layout.image_preview,vg); ImageView imv = (ImageView) v.getChildAt(0); TextView dt = (TextView) v.getChildAt(1); TextView ttl = (TextView) v.getChildAt(2); 

当你提供一个ViewGroup作为父项时,由inflate()返回的视图就是这个父项(在你的情况下是vg )而不是新创build的视图。 因此, v指向ViewGroup vg而不是指向新创build的视图,因为所有的孩子都有相同的id ,每次都会返回相同的子视图( imvdtttl )。

两个解决scheme 第一个是在下一次迭代之前,在完成之后立即改变它们的id 。 因此,在下一次迭代开始的下一次创build时,新创build的视图将具有与旧视图不同的ID,因为它们仍将使用R定义的旧常量。

另一种解决scheme是将参数false添加到对inflate()的调用中,以便新创build的视图不会附加到ViewGroup,然后由inflate()函数而不是ViewGroup返回。 剩下的代码将作为参与,除了在迭代结束时必须将它们附加到ViewGroup之外。

请注意,您仍然需要提供ViewGroup,因为它将用于确定LayoutParams的值。

我有同样的问题,并根据@SylvainL的答案,这是一个工作的解决scheme:

 // myContext is, eg the Activity. // my_item_layout has a TextView with id='text' // content is the parent view (eg your LinearLayoutView) // false means don't add direct to the root View inflated = LayoutInflater.from(myContext).inflate(R.layout.my_item_layout, content, false); // Now, before we attach the view, find the TextView inside the layout. TextView tv = (TextView) inflated.findViewById(R.id.text); tv.setText(str); // now add to the LinearLayoutView. content.addView(inflated);