Torben
Torben

Reputation: 3911

Creating table rows programmatically while defining layout in XML

I am trying to add rows to a TableLayout that I define in an XML file. The XML file contains a header row for the table.

I can add new rows quite well using info from various tutorials but the code required for setting up the layout for the new rows is a horrendous mess and it seems like a pain in the ass to maintain whenever the layout for the header row changes.

Is it possible to create new rows to a TableLayout while still defining the row layout in XML? For example define a template row in XML, obtain a handle to it in code and then clone the template whenever I need it.

Or is the right way to do this somehow completely different?

Upvotes: 0

Views: 4287

Answers (1)

adamp
adamp

Reputation: 28932

Your proposed approach will work fine and it more or less matches the common pattern used when populating ListView items.

Define a layout that contains a single row. Obtain a LayoutInflater by using LayoutInflater.from(myActivity). Use this inflater to create new rows using your layout like a template. Generally you will want to use the 3-argument form of LayoutInflater#inflate passing false for the third attachToRoot parameter.

Let's say you wanted to use a template layout with a label and a button in each item. It might look something like this: (Though yours would define your table rows instead.)

res/layout/item.xml:

<LinearLayout android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <TextView android:id="@+id/my_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    <Button android:id="@+id/my_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>

Then at the point where you inflate:

// Inflate the layout and find the component views to configure
final View item = inflater.inflate(R.layout.item, parentView, false);
final TextView label = (TextView) item.findViewById(R.id.my_label);
final Button button = (Button) item.findViewById(R.id.my_button);

// Configure component views
label.setText(labelText);
button.setText(buttonText);
button.setOnClickListener(buttonClickListener);

// Add to parent
parentView.addView(item);

Upvotes: 5

Related Questions