gogs09
gogs09

Reputation: 169

How to dynamically insert a relative layout into a table layout

I am a newbie to Android Programming. I want a table layout that has 3 rows and 3 columns(may be I will dynamically change these numbers), with each table row having a relative layout inside it. This is similar like the view shown in Google Play Store which shows the new arrivals on Play etc.. I have tried using buttons to achieve this. But I want to inflate an xml file, having Relative Layout as the root with an ImageView and TextView. Is this possible? Or what is the best way to acheive this type of layout? Also, how to find the imageview and textview of the inflated layout so that I can programatically add properties to it. This is what I have tried.

private void populateCategoryGrid() {
        TableLayout categoriesLayout;
        TableRow row;
        Button btn_category;  int category_count = 12;
        int NUM_ROW = category_count/3;
        int NUM_COL = category_count/4;

        for (int r=0;r<NUM_ROW;r++) {
            row = new TableRow(this);
            row.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    TableLayout.LayoutParams.MATCH_PARENT,
                    1.0f
            ));
            categoriesLayout.addView(row);
            for (int c = 0; c <NUM_COL; c++) {
                btn_category = new Button(this);
                btn_category.setId(c);
                btn_category.setPadding(0, 0, 0, 0);
                btn_category.setLayoutParams(new TableRow.LayoutParams(
                        TableRow.LayoutParams.MATCH_PARENT,
                        TableRow.LayoutParams.MATCH_PARENT,
                        1.0f
                ));
                row.addView(btn_category);
            }
        }
    }

Upvotes: 2

Views: 1170

Answers (1)

Simas
Simas

Reputation: 44158

You pretty much did all the work by looping and inflating buttons into rows. Few adjustments and you're done:

private void populateCategoryGrid() {
    TableLayout categoriesLayout;
    int category_count = 12;
    int NUM_ROW = category_count/3;
    int NUM_COL = category_count/4;
    LayoutInflater inflater = LayoutInflater.from(this);

    // Add rows
    for (int r=0;r<NUM_ROW;r++) {
        TableRow row = new TableRow(this);
        row.setLayoutParams(new TableLayout.LayoutParams(
                TableLayout.LayoutParams.MATCH_PARENT,
                TableLayout.LayoutParams.MATCH_PARENT,
                1.0f
        ));
        // Add inflated layouts
        for (int c = 0; c <NUM_COL; c++) {
            // Inflate layout
            RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.rel_layout, null);
            // Modify inflated layout
            ImageView img = (ImageView) rl.findViewById(R.id.img);
            img.setBackgroundColor(Color.RED);
            TextView tv = (TextView) rl.findViewById(R.id.text);
            tv.setText("Some text");
            // Add the modified layout to the row
            row.addView(rl);
        }
        // Add row to the table
        categoriesLayout.addView(row);
    }
}

A few notes:

  • You can use a local variable for each TableRow since once the row is done, you won't change anything inside of it
  • LayoutInflater.inflate returns the root view, in which you can findViewById any views located inside of it

Upvotes: 2

Related Questions