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>
Я хочу перебрать свою модель данных и ввести несколько представлений, состоящих из первого макета, в основной макет. Я знаю, что могу сделать это, полностью создав элементы управления в коде, но мне было интересно, есть ли способ динамического построения представлений, чтобы я мог продолжать использовать макет вместо того, чтобы помещать все код.
5 ответов:
использовать
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 и т. д. внутри. Мой пример:
res / layout / 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:
res / layout / 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); }причина I опубликуйте этот очень похожий ответ: когда я попытался реализовать решение Марка, я застрял на том, какой xml-файл следует использовать для insert_point и дочернего представления. Сначала я использовал макет в представлении ребенка, и он полностью не работал, что заняло у меня несколько часов, чтобы понять. Так что надеюсь, что мое исследование может сэкономить время других.
// Parent layout LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout); // Layout inflater LayoutInflater layoutInflater = getLayoutInflater(); View view; for (int i = 1; i < 101; i++){ // Add the text layout to the parent layout view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false); // In order to get the view we have to use the new view with text_layout in it TextView textView = (TextView)view.findViewById(R.id.text); textView.setText("Row " + i); // Add the text view to the parent layout parentLayout.addView(textView); }
Comments