Android: проблемы с LayoutInflater и findViewById

Я пытаюсь использовать LayoutInflater в цикле, но каждый раз, когда создается экземпляр одного из этих парней, мне нужно изменить как минимум 2 TextView, найденных в каждом экземпляре. То, что у меня есть на данный момент, создается соответствующим образом и добавляет раздутое представление xml так, как я этого хочу, но в результате изменяются только ресурсы первого экземпляра, и поэтому он просто перезаписывается много раз.

            LayoutInflater inflater;
            TextView eTitle;

            for(String[] episode : episodes) {

                //Log.d("Episodes", episode[0] + " / " + episode[2]);
                inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                inflater.inflate(R.layout.episode_list_item, listView);
                eTitle = (TextView) findViewById(R.id.episode_list_item_title);

                eTitle.setText(episode[2]);
            }

Пример вывода моего списка:

  • 04 - Эпизод 04
  • Название эпизода
  • Название эпизода
  • Название эпизода

где это должно выглядеть так:

  • 01 - Эпизод 01
  • 02 - Эпизод 02
  • 03 - Эпизод 03
  • 04 - Эпизод 04

что мне нужно сделать, чтобы убедиться, что я получаю соответствующий уникальный идентификатор textview из моих завышенных макетов?


person RedactedProfile    schedule 21.01.2012    source источник
comment
Код, который вы разместили, выглядит довольно противно. Можете ли вы объяснить, в каком месте вы это пишете (то есть, какой класс и какой метод)?   -  person aqs    schedule 21.01.2012
comment
эм... ничего особенного, это в моем классе эпизодов, он выполняет асинхронный вызов моего сервера для сбора json, затем анализирует json и помещает контролируемый набор элементов в ArrayList‹String[]›, известный как эпизоды, и все это происходит в onCreate. Здесь я просматриваю эпизоды в списке массивов. Ни один из других материалов не имеет значения, я извлекаю правильные данные, единственная проблема заключается в том, что этот layoutinflater и findViewById не захватывают правильный ресурс в моих экземплярах представлений.   -  person RedactedProfile    schedule 21.01.2012
comment
Однако я мог бы объяснить, что элемент listView, на котором я использую инфлятор макета, представляет собой просто вертикально ориентированный LinearLayout, лол.   -  person RedactedProfile    schedule 21.01.2012
comment
это listView? или просто есть статические TextView?   -  person aqs    schedule 21.01.2012
comment
listView — это просто имя в этом контексте и совпадение с тем, что есть что-то, называемое ListView. listView в данном случае представляет собой просто вертикально ориентированный LinearLayout.   -  person RedactedProfile    schedule 22.01.2012


Ответы (4)


Почему бы вам не использовать ListView вместо этого?

 LayoutInflater inflater = inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

for(String[] episode : episodes) {
    View view = inflater.inflate(R.layout.episode_list_item, null);
    mTitle = (TextView) view.findViewById(R.id.episode_list_item_title);
    mTitle.setText(episode[2]);

listView.addView(view);

}
person user634545    schedule 21.01.2012
comment
это решение в конечном итоге работало ОТЛИЧНО. Хотя я не использовал ListView, я просто использовал свой существующий объект listView, который является просто объектом LinearLayout, но в итоге он все равно отлично работал. Посмотрите, чего я не знал, и что было волшебным трюком, это View view = inflater и т. д. Я не знал, что могу назначить такой объект представления, и теперь это имеет смысл, потому что использование представления означает, что я ссылаюсь конкретный вопрос. Красивый! Спасибо д! - person RedactedProfile; 22.01.2012
comment
Это сработало для меня... кажется, я использовал почти тот же код, что и у меня, но в другом порядке (мой макет и список, который я переместил за пределы цикла, и я установил текст перед добавлением его в listVie) - person joshhendo; 11.02.2012

Я предполагаю, что у вас есть несколько TextView в вашем LinearLayout. Во-первых, у них не может быть одинаковых id. Итак, предположим, что у вас есть 4 TextView, затем дайте каждому разные id, скажем, tv1, tv2 и т. д.

Теперь в вашем методе onCreate инициализируйте все эти textViews как:

myTextView1= (TextView)findViewByid(R.id.tv1);

и т.д. и т.п...

В функции, где вы получаете эпизоды, попробуйте следующее:

`myTextView1.setText (эпизоды [0]);

myTextView2.setText (эпизоды [1]);

Вам не нужно использовать какие-либо inflater, потому что они уже есть в файле layout действий, что автоматически выполняется в onCreate.

person aqs    schedule 21.01.2012
comment
+1. Хорошая мысль, но я думаю, что это только половина решения ;-). И извините, я думаю, что динамическая установка идентификаторов — это хорошо, но искать их — это излишество. Мы только что сделали их. Итак, они у нас есть, зачем искать? - person Gangnus; 22.01.2012

Изменить линии

inflater.inflate(R.layout.episode_list_item, listView);
eTitle = (TextView) findViewById(R.id.episode_list_item_title);

в строки:

eTitle =inflater.inflate(R.layout.episode_list_item, listView, false);
listView.addChild(eTitle );

Однострочная конструкция View eTitle =inflater.inflate(R.layout.episode_list_item, listView, true); просто никогда не работает на практике.

И aqs прав (второй раз в день делаю ему комплимент), создавайте id динамически, ваши xml макеты для eTitle должны быть свободны от id, если вы ждете многих из них.

person Gangnus    schedule 21.01.2012

Я полагаю, вы забыли захватить представление, которое раздувается, а затем ищете ВНУТРИ этого представления новый элемент управления.

Вот ваш исходный код:

inflater.inflate(R.layout.episode_list_item, listView);
eTitle = (TextView) findViewById(R.id.episode_list_item_title);

Я думаю, что ваш код должен выглядеть примерно так (поиск представления, содержащегося в расширенном представлении):

View new_view = inflater.inflate(R.layout.episode_list_item, listView, false);
eTitle = (TextView) new_view.findViewById(R.id.episode_list_item_title);
eTitle.setText(episode[2]);
listView.addView(new_view);

Это то, что заставило мой код работать, как ожидалось.

Надеюсь, это поможет!

Джон

person John Kroetch    schedule 06.05.2013