I have tableview, where create new rows and set them layout manually. In every row there are 3 main elements: image, textview for title and textview for description. To move them where I want, I use two linear layouts. I want textview for description (named as descView) show text in two lines, but instead - it shows only one. What did I do wrong or what method to call, so view shows text in two lines. Would be perfect if it wraps text by word (not char).
Screenshot of what I have now:

Code of creating new row ('New' is Object where I save information (text, image, etc.)):
private TableRow formRow(New item) {
//prepare table row parameters
TableRow tr = new TableRow(this);
tr.setBackgroundResource(R.drawable.results_table_row);
tr.setVerticalGravity(Gravity.CENTER);
tr.setTag(item.getTitle());
tr.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_UP) {
v.setBackgroundResource(R.drawable.results_table_row);
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.setBackgroundResource(R.drawable.results_table_row_touched);
}
return true;
}
});
//create main layout for content
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.HORIZONTAL);
//add image
int imageID = Integer.parseInt(item.getPictureSrc());
ImageView image = new ImageView(this);
image.setImageResource(imageID);
image.setPadding(5, 5, 5, 5);
layout.addView(image);
//add another layout for title and description
LinearLayout descLayout = new LinearLayout(this);
descLayout.setOrientation(LinearLayout.VERTICAL);
descLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
//add title
TextView titleView = new TextView(this);
titleView.setText(item.getTitle());
titleView.setPadding(5, 0, 0, 0);
titleView.setTextAppearance(this, R.style.TableRowStyle_ChildTitle);
titleView.setLines(1);
descLayout.addView(titleView);
//add description
TextView descView = new TextView(this);
descView.setText(item.getDescription());
descView.setPadding(5, 0, 0, 0);
descView.setTextAppearance(this, R.style.TableRowStyle_ChildText);
descView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
descView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
//descView.setEllipsize(TextUtils.TruncateAt.END);
descView.setLines(2);
descLayout.addView(descView);
//add description layout to main layout
layout.addView(descLayout);
//finally, add layout to row
tr.addView(layout);
return tr;
}
I have a similar setup like this for some of my applications, but personally, with something like that, I would scrap the 2 LinearLayouts and use a single RelativeLayout for this, and I would try getting rid of:
descView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
descView.setLines(2);
Then I would position the items relatively to each other and the sides with a Width of that TextView set to FILL_PARENT and its height to WRAP_CONTENT.
You could get a much more uniform appearance for that with a RelativeLayout:
Set the ImageView with ALIGN_PARENT_LEFT, give it a margin of x-dip on the right and left.
Then add your Title TextView and align it to the RIGHT of the ImageView.
Then add your Description TextView and align it to the RIGHT of the ImageView and BELOW the Title.
Since you're doing it through code though, I would go even one step further since it looks like they're both the same font style (title is just bolded) and make it a single TextView for both title/description, then just use:
textView.setText(Html.fromHtml("<b>" + item.getTitle() + "</b><br>" + item.getDescription()));
Just make sure you give everything a unique ID to link to, and don't align to something that hasn't been displayed yet or you'll throw a NPE or it just won't display right at all.
But yeah, I'll use a RelativeLayout for listing items with multiple components over a LinearLayout any day.
Hope it helps~
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With