Подтвердить что ты не робот

Как раздуть несколько экземпляров макета с одним и тем же идентификатором внутри раздутого макета

У меня есть LinearLayout со многими вложенными LinearLayouts и TextViewss

Мое основное действие раздувает основной LinearLayout,

Затем я загружаю данные с сервера и на основании полученных данных добавляю несколько макетов в держатель места (LinearLayout)

Это простая страница новостей, в которой я загружаю изображения, связанные с новостями, и помещаю их в исходный пустой LinearLayout.

Каждое изображение имеет следующую информацию: Title (TextView), Date (TextView), Image (ImageView), так что я действительно делаю следующее:

* Обратите внимание, что это только существенное кодирование в вопросе, я собрал все try → catch... 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 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

      }
}

Приведенный выше код подходит для одного изображения

Но для нескольких изображений Image Loader не работает, я предполагаю, потому что все ImageViews (надутые несколько раз) имеют один и тот же идентификатор

4b9b3361

Ответ 1

Есть ли причина, по которой ImageView в XML-макете должен иметь идентификатор? Не могли бы вы удалить атрибуты android: id из макета 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);

Ответ 2

Когда вы предоставляете ViewGroup для использования в качестве родителя, представление, возвращаемое inflate(), является этим родителем (vg в вашем случае), а не вновь созданным представлением. Поэтому v указывает на ViewGroup vg, а не на вновь созданный View, и поскольку все ваши дети имеют одинаковый id, возвращаются те же подзаголовки (imv, dt, ttl)) каждый раз.

Два решения. Первый из них - изменить их id сразу после того, как вы закончите с ними, перед следующей итерацией. Поэтому при следующем создании в начале следующей итерации вновь созданные представления будут иметь разные идентификаторы из старых представлений, потому что они все равно будут использовать старую константу, определенную в R.

Другим решением было бы добавить параметр false для вызова inflate(), чтобы вновь созданный вид не был присоединен к ViewGroup и затем будет возвращен функцией inflate() вместо ViewGroup. Остальная часть вашего кода будет работать с тем исключением, что вам придется присоединить их к ViewGroup в конце итерации.

Обратите внимание, что вам все равно необходимо предоставить ViewGroup, потому что он будет использоваться для определения значения LayoutParams.

Ответ 3

У меня была такая же проблема, и на основе ответа от @SylvainL вот рабочее решение:

// 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);