Android: проблемы LayoutInflater и findViewById - PullRequest
4 голосов
/ 21 января 2012

Я пытаюсь использовать 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 из моих раздутых макетов?

Ответы [ 4 ]

8 голосов
/ 22 января 2012

Почему бы вам не использовать 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);

}
1 голос
/ 22 января 2012

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

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

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

и т. Д. И т. Д.

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

`myTextView1.setText (episodes [0]);

myTextView2.setText (episodes [1]);

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

0 голосов
/ 06 мая 2013

Я полагаю, что вы забыли захватить завышенное представление, а затем искать В этом представлении новый элемент управления.

Вот ваш оригинальный код:

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

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

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

John

0 голосов
/ 22 января 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, если вы ожидаете многих из них.

...