Я расширил 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;
}
}