如何在充气布局内充气具有相同 id 的布局的多个实例

2023-12-21

我有一个带有许多嵌套 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(使用前将#替换为@)

如何在充气布局内充气具有相同 id 的布局的多个实例 的相关文章

随机推荐