如何膨胀充气布局内具有相同ID的布局的多个实例(How to inflate multiple in

2019-08-16 17:45发布

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

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

然后我从服务器加载数据和基于接收到的数据,我在占位符添加多个布局(LinearLayout中)

这是简单的一个新闻网页,我加载与新闻相关的图像,并把它的最初为空的LinearLayout内。

每幅具有以下信息:标题(TextView的),日期(TextView的),图像(ImageView的),所以我实际上做的是以下几点:

* 请注意,这只是我elemenated所有尝试编码问题的本质- >捕捉...的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

Answer 1:

有没有为什么在布局XML中的ImageView需要有一个ID的原因是什么? 你能删除了android:id从1 image_preview.xml布局属性,然后简单的通过膨胀的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);


Answer 2:

当您提供一个ViewGroup中用作父,返回的视图inflate()这是父( vg你的情况),而不是新创建的视图。 因此, v向的ViewGroup点vg ,而不是向新创建的视图,并为所有的孩子都具有相同id ,同一子视图( imvdtttl )返回各一次。

两种解决方案。 第一个是改变自己id ,你就完成了他们之后,下一次迭代之前。 因此,在下一迭代开始的下一个创作,新创建的视图将有从旧浏览不同的ID,因为他们仍然将使用所定义的老恒R

另一解决方案是添加参数假到呼叫膨胀(),使得新创建的视图将不会附着到的ViewGroup,然后将被充气()函数来代替的ViewGroup被返回。 你的代码就可以作为与你将不得不将它们连接到的ViewGroup在迭代结束例外参加的其余部分。

请注意,您仍然需要提供一个ViewGroup中,因为它会被用来确定的LayoutParams的价值。



Answer 3:

我有同样的问题,并根据从@SylvainL,here'a工作液的答案:

// myContext is, e.g. the Activity.
// my_item_layout has a TextView with id='text'
// content is the parent view (e.g. 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);


文章来源: How to inflate multiple instances of a layout with the same id inside an inflated layout