chesnutcase
chesnutcase

Reputation: 522

Android - textviews are not visible when dynamically created

I am trying to make an app that lets the user store and saves contacts. It can save, but it has problems listing.

I have a for loop that runs through the database and prints a set of data for each contact (each row), an image (actually its a string because it passes the path) and a string. It prints them in a scrollview with a linear layout for each contact (each contact has a linear layout of its own, so that i can let one contact occupy a row each). The images come out, however, the textviews are nowhere to be found.

Using log.d(textview.getText()); it confirms that the textviews are created and take up space. http://chesnutcase.heliohost.org/derpbox/itv1.png Two "contacts" with names, not printed out. The space inbetween is presumbly by the textview. http://chesnutcase.heliohost.org/derpbox/itv2.png Another two "contacts", but without names. The dont have a space between each other. Or at least, a significantly smaller space. Code:

DatabaseHandler db = new DatabaseHandler(this);
    int a = (int) (long) db.countRows();
    LinearLayout theLayout = (LinearLayout)findViewById(R.id.contactsList);
    for(int i = 0;i<a;i++){
        ImageButton image = new ImageButton(this);
        int density=getResources().getDisplayMetrics().densityDpi;
        LinearLayout.LayoutParams vp  = new LinearLayout.LayoutParams(density,density, 0.5f);
        image.setLayoutParams(vp);
        image.setScaleType(ImageView.ScaleType.FIT_END);
        int b = a - i;
        try {
            image.setImageBitmap(decodeUri(Uri.parse(db.getContactData("photo_path")[i])));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        theLayout.addView(image);
        TextView tv = new TextView(this);
        tv.setText(db.getContactData("name")[i]);
        Log.d("UserLog","name is "  + db.getContactData("name")[i]);
        Log.d("UserLog","textfield contains " + tv.getText());
        LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
        tv.setLayoutParams(vp2);
        tv.setBackgroundColor(Color.RED);
        theLayout.addView(tv);
    }

Any solutions? Thanks in advance

Upvotes: 1

Views: 1604

Answers (4)

jlindenbaum
jlindenbaum

Reputation: 1881

Double check which orientation you've applied to the LinearLayout of your contacts list.

You are setting bad LayoutParams to your TextView. You're making your TextView 0px by 0px with a weight of 1.

LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);
tv.setLayoutParams(vp2);

Try using one of the MATCH_PARENT or WRAP_CONTENT constants. They're listed here: http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT

If you want your TextView to take up the remaining width of the screen I would leave the weight as 1, the width as 0, but you need to set the height to a constant like WRAP_CONTENT.

You're also setting the size of your ImageView to the device screen density (which is a constant) instead of setting a scaling size based off your screen density.

Upvotes: 2

ScouseChris
ScouseChris

Reputation: 4397

I would recommend using a CursorAdapter and a layout xml file, this way you can design it to look exactly how you want, and preview it. It is a lot easier than setting all those fiddly LayoutParams

If you have to create them dynamically you may find the text colour is the same as the background, try setting it to something visible like bright red for testing. If you still don't see the text it may be that it's visibility isn't set to View.VISIBLE finally the layout may not be the correct size, a handy tip for this is set the background to a suitably eye catching colour, even if there is no text you should see a shaded block.

Upvotes: 0

IronBCC
IronBCC

Reputation: 429

It is better to use ListView for such list. You will need to write only one Adapter, that's represent logic for creating one row on list.

Upvotes: 0

nunofmendes
nunofmendes

Reputation: 3791

You probably need to call requestLayout(); in order to update the current view layout.

theLayout.requestLayout();

Also it seems you are creating a view with 0 width and 0 height with that layout params:

LinearLayout.LayoutParams vp2  = new LinearLayout.LayoutParams(0,0,1f);

Upvotes: 1

Related Questions