list item ignoring set height, using wrap_content instead - android

I have a problem with my list item layouts that i cannot understand. I set the height of a list item to 70dp but if i only have content with a total height of 40dp it will automatcally just ignore the value i set with android:layout_height and instead use what seems to be wrap_content as the height.
If i use the exakt same layout outside of a list it works as intended.
below is the layout of a list item from one of my lists.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="70dip"
android:layout_width="fill_parent">
<TextView android:id="#+id/name"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
style="#style/NormalText"/>
<TextView android:id="#+id/description"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
style="#style/VerySmallLightText"/></LinearLayout>
Editted my xml to reflect my code better. i have some of there attributes in style, that is why i accidently made a typo when tying it in manually here.

Have you tried layout_height of the linear layout instead of just the height?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="70dp"*
android:layout_width="fill_parent">

your linearlayout attribute the following
android:height = '70dip' is it can passing the IDE checking?

Related

How to specify indents to Text Views?

What value should I change?
I"ve an .xml file that contains all the text representations for the display table rows.
I've an adapter, which is fine to display all in the main_activity.xml.
Paddings: paddingTop,paddingLeft, paddingRight, paddingBottom
or
Margins: layout_marginTop,layout_marginLeft, layout_marginRight, layout_marginBottom
depending on your exact needs.
You can use attribute layout_marginLeft, layout_marginRight, layout_marginTop and layout_marginBottom to specify indents.
Here is an example:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="#+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:text="This is a sample text" />
</LinearLayout>
OUTPUT:
Assuming this is a recyclerView or ListView and you are using a List Item layout for each instance.
In your list item layout:
Set a textView for each item in each row.
Then for each textview use either a fixed layout_width or use Layout_width="0" in conjunction with Layout_weight to space your textviews.
(fixed Layou_width is easier, but using Layout_Weight will auto adjust for screen orientation)
then your spacing will be consistent from row to row because it is based on the layout definitions and not the inserted text.

Listview OnClick does not work

I have some code that displays a ListView and allows an item to be clicked to take it to a single view activity. However, for some reason the onClickListener isn't working. I thought that this may be due to the EditText being focusable. However, upon setting this to false, I found it was not the case.
listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/text"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5sp"
android:textSize="15dp"
android:inputType="textMultiLine">
</TextView>
Use android:descendantFocusability="blocksDescendants" in your list item layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants">
<TextView
android:id="#+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5sp"
android:textSize="15dp"
android:inputType="textMultiLine" />
</LinearLayout>
Replaced fill_parent by match_parent as it's deprecated.
Remove the inputType attribute on you TextView layout:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:textSize="15sp"/>
Also as you can see I'm using the match_parent and wrap_content for width and height respectively. fill_parent is deprecated now.
Match parent means it will fit the whole ListView in width and wrap content is that the hieght will span as much as needed, therefore the whole text will be visible, even if it's multi-line.
Another note: for text sizes you use sp for widths, heights, etc you use dp. Worthy article explains it further.
Background tasks once executed will not have a handle. So your listview listener will be killed. You need to remove it from the background and have it in your onCreate. You can set a flag in postExecute and do implementation if it is dependent on that.

how resize Android ListView row height

Listview row height is too big. I designed row item so. This is ListViewItem Layout axml file
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#drawable/list_style"
android:gravity="center_horizontal"
android:minWidth="25px"
android:minHeight="25px">
<TextView
android:text="Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="#+id/forecastName"
android:gravity="center_vertical"
android:padding="10px"
android:textColor="#color/black"/>
</LinearLayout>
and this is Listview layout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#drawable/list_style"
android:minWidth="25px"
android:minHeight="25px">
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#+id/forecast"
android:divider="#drawable/separator"
android:dividerHeight="3px" />
</LinearLayout>
When application lunches list view item has some height, it not match textview size. How can i resize row height?
You can just simply provide fixed height in row layout XML:
android:layout_height="25dp"
One additional remark: Always use dp (or dip) instead of px when setting view dimensions.
Just adding to the previous answers, you can remove android:minWidth and android:minHeightto allow the row wrap the text or you can set the height you want.
Android has a default value for list item height.
android:height="?android:attr/listPreferredItemHeight"
The problem was background image size. android:background="#drawable/list_style" I use image from background. so i changed size of image. thanks.
If rows are bigger than expected, that could be due to android:minWidth and android:minHeight. Try to remove those atributes.
I see that you are setting units in px. It is not recomended to do such a thing. You should use dp instead of px, except for text size. For text size it is recommended to use sp.
Without a screenshot this is all I got. Let me know if this helps.

Android layout weight problem

friends,
i have written following layout code and buttons to be displayed on screen equally but it not seems to work any one guide me what mistake am i doing?
![<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#color/color_panel_background"
>
<ImageButton
android:layout_height="wrap_content"
android:id="#+id/currentLocation"
android:layout_weight="1"
android:layout_width="fill_parent"
android:src="#drawable/current_location_icon"
/>
<ImageButton
android:layout_height="wrap_content"
android:id="#+id/searchCity"
android:layout_weight="1"
android:layout_width="fill_parent"
android:src="#drawable/search_icon"
/>
<ImageButton
android:layout_height="wrap_content"
android:id="#+id/home"
android:layout_weight="1"
android:layout_width="fill_parent"
android:src="#drawable/home_icon"
/>
</LinearLayout>
</RelativeLayout>][2]
The drawable for the middle button is obviously bigger than the other two. You set the height of the buttons with wrap_content, so the middle button gets bigger. Weight has nothing to do with this. Its only defining how much space the item takes when you use fill_parent.
Easiest way to fix this is either changing the layout_height to a fixed value (use dp as unit)
or change the size of your drawables making the images all the same size to begin with.
Thumbs up for the way you asked the question. Screenshot and relevant code. Wish everybody would do that :)
Change android:layout_height from "wrap_content" to some constant if you want them to have equal height.
change your linear layout height to some constant and
change object layout_height within the linear layout to fill_parent
in Horizontal: if you set weight for child view then set with = 0dp
in Vertical: if you set weight for child view then set height = 0dp

How to set space between listView Items in Android

I tried to use marginBottom on the listView to make space between listView Item, but still the items are attached together.
Is it even possible? If yes, is there a specific way to do it?
My code is below
<LinearLayout
android:id="#+id/alarm_occurences"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_height="fill_parent"
android:background="#EEEEFF"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="#+id/occurences"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
My custom List item:
<com.android.alarm.listItems.AlarmListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#drawable/alarm_item_background"
android:layout_marginBottom="10dp"
>
<CheckedTextView
android:id="#android:id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:textSize="20sp"
android:textStyle="bold"
android:typeface="serif"
android:padding="10dp"
/>
</com.android.alarm.listItems.AlarmListItem>
How can I make spacing between list items in this case?
#Asahi pretty much hit the nail on the head, but I just wanted to add a bit of XML for anyone maybe floating in here later via google:
<ListView android:id="#+id/MyListView"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:divider="#android:color/transparent"
android:dividerHeight="10.0sp"/>
For some reason, values such as "10", "10.0", and "10sp" all are rejected by Android for the dividerHeight value. It wants a floating point number and a unit, such as "10.0sp". As #Goofyahead notes, you can also use display-independent pixels for this value (ie, "10dp").
Perhaps divider or dividerHeight property of the ListView can solve your problem.
Although the solution by Nik Reiman DOES work, I found it not to be an optimal solution for what I wanted to do. Using the divider to set the margins had the problem that the divider will no longer be visible so you can not use it to show a clear boundary between your items. Also, it does not add more "clickable area" to each item thus if you want to make your items clickable and your items are thin, it will be very hard for anyone to click on an item as the height added by the divider is not part of an item.
Fortunately I found a better solution that allows you to both show dividers and allows you to adjust the height of each item using not margins but padding. Here is an example:
ListView
<ListView
android:id="#+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
ListItem
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="10dp"
android:paddingTop="10dp" >
<TextView
android:id="#+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="Item"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
You should wrap your ListView item (say your_listview_item) in some other layout e.g LinearLayout and add margin to your_listview_item:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<your_listview_item
android:id="#+id/list_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
...
...
/>
</LinearLayout>
This way you can also add space, if needed, on the right and left of the ListView item.
My solution to add more space but keep the horizontal line was to add divider.xml in the res/drawable folder and define line shape inside:
divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<stroke
android:width="1px"
android:color="#color/nice_blue" />
</shape>
then in my list I reference my divider as follows:
<ListView
android:id="#+id/listViewScheduledReminders"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_marginBottom="#dimen/mediumMargin"
android:layout_weight="1"
android:divider="#drawable/divider"
android:dividerHeight="16.0dp"
android:padding="#dimen/smallMargin" >
</ListView>
notice the android:dividerHeight="16.0dp" by increasing and decreasing this height I am basically adding more padding on top and bottom of the divider line.
I used this page for reference: http://developer.android.com/guide/topics/resources/drawable-resource.html#stroke-element
For my application, i have done this way
<ListView
android:id="#+id/staff_jobassigned_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#null"
android:dividerHeight="10dp">
</ListView>
just set the divider to null and providing height to the divider did for me.
Example :
android:divider="#null"
or
android:divider="#android:color/transparent"
and this is result
If you want to show a divider with margins and without stretching it - use InsetDrawable (size must be in a format, about which said #Nik Reiman):
ListView:
<ListView
android:id="#+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:divider="#drawable/separator_line"
android:dividerHeight="10.0px"/>
#drawable/separator_line:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="5.0px"
android:insetRight="5.0px"
android:insetTop="8.0px"
android:insetBottom="8.0px">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#color/colorStart"
android:centerColor="#color/colorCenter"
android:endColor="#color/colorEnd"
android:type="linear"
android:angle="0">
</gradient>
</shape>
</inset>
You can use:
android:divider="#null"
android:dividerHeight="3dp"
example:
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#+id/listView" android:layout_gravity="center_horizontal"
android:dividerHeight="3dp"
android:divider="#null" android:clickable="false"/>
I realize that an answer was already been selected, but I just wanted to share what ended up working for me when I ran into this issue.
I had a listView where each entry in the listView was defined by its own layout, similar to what Sammy posted in his question. I tried the suggested approach of changing the divider height, but that did not end up looking all too pretty, even with an invisible divider. After some experimentation, I simply added an android:paddingBottom="5dip" to the last TextView layout element in the XML file that defines individual listView entries.
This ended up giving me exactly what I was trying to achieve via the use of android:layout_marginBottom. I found this solution to produce a more aesthetically pleasing result than trying to increase the divider height.
Instead of giving margin, you should give padding:
<ListView
android:id="#+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:divider="#android:color/green"
android:dividerHeight="4dp"
android:layout_alignParentTop="true"
android:padding="5dp" >
</ListView>
OR
<ListView
android:id="#+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:paddingTop="2dp"
android:divider="#android:color/green"
android:dividerHeight="4dp"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:paddingBottom="2dp"
android:paddingStart="0dp"
android:paddingEnd="0dp" >
</ListView>
Simplest solution with OP's existing code (list items already have got padding) is to add following code:
listView.setDivider(new ColorDrawable(Color.TRANSPARENT)); //hide the divider
listView.setClipToPadding(false); // list items won't clip, so padding stays
This SO answer helped me.
Note: You may face a bug of the list item recycling too soon on older platforms, as has been asked here.
you just need to make background transparent of list divider and make height according to your needed gap.
<ListView
android:id="#+id/custom_list"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:divider="#00ffffff"
android:dividerHeight="20dp"/>
<ListView
android:clipToPadding="false"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:dividerHeight="10dp"
android:divider="#null"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
and set paddingTop, paddingBottom and dividerHeight to the same value to get equal spacing between all elements and space at the top and bottom of the list.
I set clipToPadding to false to let the views be drawn in this padded area.
I set divider to #null to remove the lines between list elements.
Also one more way to increase the spacing between the list items is that you add an empty view to your adapter code by providing the layout_height attribute with the spacing you require. For e.g. in order to increase the bottom spacing between your list items add this dummy view(empty view) to the end of your list items.
<View
android:layout_width="match_parent"
android:layout_height="15dp"/>
So this will provide a bottom spacing of 15 dp between list view items. You can directly add this if the parent layout is LinearLayout and orientation is vertical or take appropriate steps for other layout. Hope this helps :-)
This will help you add the divider height.
getListView().setDividerHeight(10)
If you want to add a custom view, you can add a small view in the listView item layout itself.
I found a not-so-good solution for this in case you are using a HorizontalListView, since dividers don't seem to work with it, but I think it'll work either way for the more common ListView.
Just adding:
<View
android:layout_marginBottom="xx dp/sp"/>
in the bottomest View of the Layout you inflate in the adapter class will create spacing between items
In order to give spacing between views inside a listView please use padding on your inflate views.
You can use android:paddingBottom="(number)dp" && android:paddingTop="(number)dp" on your view or views you're inflate inside your listview.
The divider solution is just a fix, because some day, when you'll want to use a divider color (right now it's transparent) you will see that the divider line is been stretched.
A lot of these solutions work. However, if all you want is to be able to set the margin between items the simplest method I have come up with is to wrap your item - in your case the CheckedTextView - in a LinearLayout and put your margin formatting for the item in that, not the root-layout. Be sure to give this wrapping layout an id and create it along with your CheckedTextView in your adapter.
That's it. In effect, you are instantiating the margin at the item level for the ListView. Because the ListView does not know about any item layout - only your adapter does. This basically inflates the part of the item layout that was being ignored before.
Maybe you can try to add android:layout_marginTop = "15dp" and android:layout_marginBottom = "15dp" in the outermost Layout

Categories

Resources