Android – динамическое добавление просмотров в представление

У меня есть макет для представления –

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="0px" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/items_header" style="@style/Home.ListHeader" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/items_none" android:visibility="gone" style="@style/TextBlock" android:paddingLeft="6px" /> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/items_list" /> </LinearLayout> 

То, что я хочу сделать, в моей основной деятельности с макетом, подобным этому

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="0px" android:id="@+id/item_wrapper"> </LinearLayout> 

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

Используйте LayoutInflater для создания представления на основе шаблона макета, а затем введите его в представление, где оно вам нужно.

 LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = vi.inflate(R.layout.your_layout, null); // fill in any details dynamically here TextView textView = (TextView) v.findViewById(R.id.a_text_view); textView.setText("your text"); // insert into main view ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point); insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Возможно, вам придется настроить индекс, в который вы хотите вставить представление.

Кроме того, установите LayoutParams в соответствии с тем, как вы хотите, чтобы он соответствовал родительскому виду. Например, с помощью FILL_PARENT или MATCH_PARENT и т. Д.

См. Класс LayoutInflater .

 LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert); inflater.inflate(R.layout.the_child_view, parent); 

Похоже, что вы действительно хотите, чтобы ListView с настраиваемым адаптером раздувал указанный макет. Используя ArrayAdapter и метод notifyDataSetChanged() вы полностью контролируете создание и рендеринг представлений.

Взгляните на эти руководства

Чтобы сделать ответ @Mark Fisher более понятным, вставленный вид, надутый, должен быть xml-файлом в папке макета, но без макета (ViewGroup), такого как LinearLayout и т. Д. Внутри. Мой пример:

разреш / макет / my_view.xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/i_am_id" android:text="my name" android:textSize="17sp" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> 

Затем точкой вставки должно быть макет типа LinearLayout:

разреш / макет / activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/aaa" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/insert_point" android:layout_width="match_parent" android:layout_height="match_parent"> </LinearLayout> </RelativeLayout> 

Тогда код должен быть

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shopping_cart); LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.my_view, null); ViewGroup main = (ViewGroup) findViewById(R.id.insert_point); main.addView(view, 0); } 

Причина, по которой я публикую этот очень похожий ответ, заключается в том, что когда я пытался реализовать решение Mark, я застрял в том, какой файл xml должен использовать для insert_point и child view. Сначала я использовал макет в детском представлении, и он полностью не работал, и мне потребовалось несколько часов, чтобы понять. Поэтому надеюсь, что мое исследование может спасти время других.