Android: динамическое создание списка объектов, каждый из которых имеет свои собственные кнопки и редактируемые тексты

#android

#Android

Вопрос:

Я хочу динамически добавлять строки в линейный макет, где в каждой строке будет 2 кнопки и 2 редактируемых текста. Я не уверен, что лучший способ организовать это. У меня была идея создать класс для каждой строки с кнопками и редактируемыми текстами в них, но findViewById так не работает. Другая мысль заключалась в том, чтобы включить экземпляр макета для каждого объекта, но я не уверен, что лучший способ эффективного доступа к кнопкам в макете без создания прослушивателей действий, если бы у меня было 10 объектов, 20 кнопок и 20 редактируемых текстов. Возможно ли использовать массив включенных макетов и добавлять их по мере необходимости, если я делаю это таким образом?

Ответ №1:

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

Если это переменное количество строк, вы должны сделать это в виде списка с помощью пользовательского ArrayAdaptor и переработать свои макеты.

 LayoutInflater inflater = LayoutInflater.from(this);
View yourRowView = inflator.inflate(R.layout.yourrowfile, null);
yourRowView.findByViewId(R.id.firstButton). setOnClickListener(//blah blah blah

((ViewGroup)findByViewId(R.id.yourParentContainer)).addView(yourRowView);
  

LayoutInflator раздувает макеты из ваших определений макета xml. Обычно в Activity вы просто передаете R.layout.[что угодно] для setContentView, но если вы хотите динамически создавать представление и добавлять его, вы можете использовать приведенный выше код (или аналогичный). Имейте в виду, чтобы заполнить поля и активировать кнопки, вам нужно вызвать findByViewId В ПРЕДСТАВЛЕНИИ. Я часто совершаю ошибку, вызывая этот метод в activity случайно (сила привычки).

Чтобы создать представление списка с пользовательским интерфейсом, его концептуально аналогично, но схема немного сложнее, но широко описана. Вот пример:

http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

Комментарии:

1. хорошо, есть ли способ немного уменьшить это? Я только начинаю. Я должен создать макет кнопок и редактируемых текстов, а затем использовать inflator для их добавления, правильно? Как я получу доступ к отдельным макетам с помощью inflator?

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

3. Я был бы шокирован, если бы это не сработало. Зависит от того, откуда вы его вызываете. Почтовый индекс? Если вы находитесь внутри анонимной функции, вам нужно добавить «this» к имени класса Activity, например MyActivity.this. Эта форма по-прежнему доступна здесь: developer.android.com/reference/android/view/… Однако вы можете сделать это сложным способом и использовать это: LayoutInflater inflater = (LayoutInflater)context.getSystemService (контекст. LAYOUT_INFLATER_SERVICE); Вам понадобится ссылка на ‘context’, но поскольку это то, на что указывает ‘this’, та же проблема.