setListAdapter(new ArrayAdapter<String>(this,R.layout.list, R.id.label, names));
list.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:layout_width="match_parent">
<ImageView android:id="@+id/icon"
android:layout_height="wrap_content"
android:src="@drawable/icon"
android:layout_width="22px"
android:layout_marginTop="15px"
android:layout_marginRight="4px"
android:layout_marginLeft="4px">
</ImageView>
<TextView android:text="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/label" android:textSize="35px"></TextView>
</LinearLayout>
然而我的问题是如何使每个项目都独一无二(我在R.drawable中有很多图像)
所以在物品狗上,我想要一张狗图片,猫项目将成为一只猫。现在,每个项目都是默认的应用程序图标。
谢谢!
答案 0 :(得分:1)
您当前的实现应该将文本数据从您的名称数据对象绑定到textview。图像视图未显示正确图像的原因是因为适配器无法与图像视图通信。数组适配器的底层实现将使list.xml视图膨胀,并从该list.xml中拉出R.id.label所代表的视图。它将检查该视图是textview还是imageview。如果它不会抛出异常。然后它会将名称数据对象中的数据绑定到textview。
您需要的是指定自定义适配器,并确保您的数据模型包含名称的字符串和对图像资源的引用 - 在您的情况下,它将是一个整数。
以下是可能适合您的示例Name对象:
public class Name
{
private String _name;
private int _imageResourceId;
public void Name(String name, int resId)
{
_name = name;
_imageResourceId = resId;
}
public void setImageResId(int resId)
{
_imageResrouceId = resId;
}
public void setName(String name)
{
_name = name;
}
public int getImageResId()
{
return _imageResourceId;
}
public String getName()
{
return _name;
}
}
首先创建一个类并扩展BaseAdapter并实现getView,getPosition,getCount等。
以下是适用于您的示例适配器:
public class NameAdapter extends BaseAdapter
{
private Name[] _data;
private LayoutInflater _inflater;
public NameAdapter(Context context, Name[] data)
{
_data = data;
_inflater = LayoutInflater.from(context);
}
public int getCount()
{
if(_data != null)
{
return _data.length;
}
else
{
return 0;
}
}
public Object getItem(int position)
{
if(_data != null)
{
return _data[position];
}
else
{
return null;
}
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if(convertView == null)
{
convertView = _inflater.inflate(R.layout.list, parent);
holder = new ViewHolder();
holder._image = (ImageView) convertView.findViewById(R.id.icon);
holder._label = (TextView) convertView.findViewById(R.id.label);
convertView.setTag(holder);
}
if(holder == null)
{
holder = (ViewHolder) convertView.getTag();
}
holder._image.setImageResource(_data[position].getImageResourceId());
holder._label.setText(_data[position].getName());
}
static class ViewHolder
{
TextView _label;
ImageView _image;
}
}
*注意:我没有对此进行测试,因此您可能需要稍微调整一下。
另外,作为优化,我建议将list.xml更改为:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/label"
android:textSize="16sp" />
使用TextView,您可以使用“setCompoundDrawable”或“setCompoundDrawablesWithIntrinsicBounds”,并真正优化您的布局。复合drawable允许您将图像放置在文本视图的左侧或右侧或上方或下方。我建议您查看api文档以获取进一步的实现细节。
希望有所帮助!