Пользовательский адаптер не отображает (заполненный) TextView, когда второй TextView виден - PullRequest
1 голос
/ 30 июля 2011

Я расширил ArrayAdapter для поддержки изображения, отображаемого в стороне от двух TextView.

Сам макет отображается правильно с помощью универсального ArrayAdapter (который определяет только текст одного TextView).

http://i.stack.imgur.com/nRSKQ.jpg

При использовании пользовательского адаптера (который перезаписывает ArrayAdapter.getView () для установки значка и текстов) при рендеринге отсутствует «Hello World» - R.id.item_title - text.

http://i.stack.imgur.com/FSc5Z.jpg

ierarchyviewer: item_title - Layout / getHeight () = 0, но содержимое «Hello World» определяется как текст.

При установке R.id.item_subtitle в View.GONE будет отображаться R.id.item_title (как и ожидалось).

Знаете ли вы, по какой причине R.id.item_title имеет высоту ноль, поэтому текст не отображается / отображается? Чего-то не хватает в SimpleImageItemAdapter.getView ()?

developer.android.com / ссылка / Android / виджет / ArrayAdapter.html

Чтобы использовать что-то кроме TextViews для отображения массива, для экземпляр, ImageViews, или иметь некоторые данные, кроме toString () результаты заполняют представления, переопределяют getView (int, View, ViewGroup) на верните желаемый тип просмотра.


Источник

tasks_dialog.xml - содержит ListView

<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tasks_dialog"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
/>

tasks_dialog_item.xml - элементы, отображаемые ListView на основе developer.android.com/resources/articles/layout-tricks-efficiency.html

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">

    <ImageView
        android:id="@+id/item_icon"

        android:layout_width="wrap_content"
        android:layout_height="fill_parent"

        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip"

        android:src="@drawable/icon" />

    <TextView  
        android:id="@+id/item_subtitle"

        android:layout_width="fill_parent"
        android:layout_height="wrap_content"

        android:layout_toRightOf="@id/item_icon"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"

        android:text="Simple application that shows how to use RelativeLayout"
        android:ellipsize="marquee"
        android:singleLine="true"
 />

    <TextView
        android:id="@+id/item_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"

        android:layout_toRightOf="@id/item_icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/item_subtitle"
        android:layout_alignWithParentIfMissing="true"

        android:gravity="center_vertical"
        android:text="My Application" android:minHeight="6dp"/>

</RelativeLayout>

TestActivity.java

public class TestActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tasks_dialog);

        ListAdapter adapter;

        // ArrayAdapter - works perfect. See screenshot #1
        {
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.tasks_dialog_item, R.id.item_title);
            arrayAdapter.add("Hello World");
            arrayAdapter.add("Lorem Ipsum");

            adapter = arrayAdapter;
        }

        // Custom adapter - unexpected result: missing TextView `item_title`. See screenshot #2
        {
            ContentValues[] customItems = new ContentValues[2];

            customItems[0] = new ContentValues(); // do not overwrite item - use default texts for testing
            customItems[1] = new ContentValues(); // do not overwrite item - use default texts for testing

            adapter = new SimpleImageItemAdapter(this, R.layout.tasks_dialog_item, customItems);
        }

        // render ListView with adapter or customAdapter
        ListView menuList = (ListView) findViewById(R.id.tasks_dialog);
        menuList.setAdapter(adapter);
    }
}

SimpleImageItemAdapter.java

/**
 * Simple adapter renders an icon and up to two text views based on ContentValue encoded data.
 * 
 * Usage/variables:
 * 
 * > ContentValues.put("title", "Hello World");
 * > ContentValues.put("subtitle", "»Hello World« is a dummy text");
 * > ContentValues.put("icon", R.drawable.fancyIcon);
 */
public class SimpleImageItemAdapter extends ArrayAdapter<ContentValues> {
    protected ContentValues[] mItems;


    public SimpleImageItemAdapter (Context context, int textViewResourceId, ContentValues[] items) {
        super(context, textViewResourceId, items);

        mItems = items;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // load layout
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.tasks_dialog_item, null);
        }

        ContentValues item = mItems[position];

        // render elements
        if (item != null) {
            if (item.getAsString("title") != null) {
                TextView titleView = (TextView) convertView.findViewById(R.id.item_title);
                titleView.setText((String) item.get("title"));
            }

            if (item.getAsString("subtitle")  != null) {
                TextView subTitleView = (TextView) convertView.findViewById(R.id.item_subtitle);
                subTitleView.setText((String) item.get("subtitle"));
            }

            if (item.getAsInteger("icon") != null) {
                ImageView imageView = (ImageView) convertView.findViewById(R.id.item_icon);
                imageView.setImageDrawable(convertView.getResources().getDrawable(item.getAsInteger("icon")));
            }
        }

        return convertView;
    }
}

1 Ответ

0 голосов
/ 02 августа 2011

Проблема с вашим XML-файлом. Переопределите tasks_dialog_item.xml как этот;

<?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="?android:attr/listPreferredItemHeight"
    android:padding="6dip">

    <ImageView android:id="@+id/item_icon" 
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true" 
        android:layout_alignParentBottom="true"
        android:layout_marginRight="6dip" 
        android:src="@drawable/icon" />

    <LinearLayout android:orientation="vertical" 
                  android:layout_toRightOf="@id/item_icon"
                  android:layout_width="fill_parent" 
                  android:layout_height="wrap_content">

        <TextView android:id="@+id/item_title" 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:text="My Application" />    

        <TextView  android:id="@+id/item_subtitle" 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:text="Simple application that shows how to use RelativeLayout"
            android:ellipsize="marquee" 
            android:singleLine="true" />

    </LinearLayout>

</RelativeLayout>
...