Android开发:listview图片

时间:2010-12-19 00:01:28

标签: android

到目前为止,我已经使用过这个:

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中有很多图像)

所以在物品狗上,我想要一张狗图片,猫项目将成为一只猫。现在,每个项目都是默认的应用程序图标。

谢谢!

1 个答案:

答案 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文档以获取进一步的实现细节。

希望有所帮助!