pepr
pepr

Reputation: 20752

How the display bug of TextView drawableStart can be explained?

Update: Simpler code created and presented here, full layout XML definitions.

When trying to replace the row layout with the icon on the left by the new drawableStart attribute of the TextView element in XML layout, I can observe the following wrongly displayed last item (captured on Nexus 7): Notice only the half of the item 3.

The related code is -- MainActivity:

package cz.skil.android.tut.testtextviewdrawablestart;

import android.os.Bundle;
import android.app.Activity;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_list);

        ListView listView = (ListView) findViewById(R.id.mylist);
        String[] values = new String[] {"item 1", "item 2", "item 3"};

        MyAdapter adapter = new MyAdapter(this, values);

        listView.setAdapter(adapter);         
    }
}

MyAdapter

package cz.skil.android.tut.testtextviewdrawablestart;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;

    public MyAdapter(Context context, String[] values) {
        super(context, R.layout.row, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.row, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.mylabel);
        textView.setText(values[position]);
        return rowView;
    }
}

The main_list.xml 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="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" > <!-- Update: here is the bug -->
    </ListView>

</LinearLayout>

and finally the row.xml layout:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/mylabel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"

    android:layout_marginLeft="4dp"
    android:drawablePadding="8dp"
    android:drawableStart="@drawable/reminder"       

    android:lines="1"
    android:textSize="24sp" >

</TextView>

I guess the reason is that the height of the area for displaying the items is calculated from dimensions declared for the text; however, the icon possibly forces a bigger height for the list item.

Can you confirm the behaviour? If yes, why it behaves so? I am new to Android. It is likely I am doing it wrongly.

(The question is loosely related to this one: Android layout: on TextView and android:drawableStart -- setting size of the icon?).

Upvotes: 1

Views: 1623

Answers (2)

Vladimir Mironov
Vladimir Mironov

Reputation: 30864

It's always wrong to set android:layout_height="wrap_content" for a ListView. It works as expected with android:layout_height="fill_parent". More detailed explanation could be found here The World of ListView

Upvotes: 3

akaya
akaya

Reputation: 1140

Though I don't know if this is intended behaviour or bug, this happens when you use drawableStart. Change it to drawableLeft and it will draw the layout properly.

<TextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/mylabel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"

    android:layout_marginLeft="4dp"
    android:drawablePadding="8dp"
    android:drawableLeft="@drawable/reminder"       

    android:lines="1"
    android:textSize="24sp" >

</TextView>

Upvotes: 2

Related Questions