Android ListView:具有ImageView的自定义适配器

在上一篇文章中,我们讨论了自定义适配器。 我们只使用了一个非常简单的适配器和一个TextView 。 我们想扩展前面描述的想法,并为每个行星介绍一个图像。 为此,我们必须修改布局和其他代码部分以处理用户单击每个项目的情况。 我们希望ListView中的每一行看起来像:

我们要做的第一件事是修改布局并使用RelativeLayout而不是简单的LinearLayout。 我们的布局如下:

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

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"/>

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/img"
        android:layout_toRightOf="@+id/img"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/dist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/name"
        android:layout_gravity="center"
        android:layout_marginTop="2dip"
        android:layout_toRightOf="@id/img"
        android:gravity="right"
        android:textSize="8dp"
        android:textStyle="italic" />

</RelativeLayout>

上面显示的布局非常简单,我们不需要解释。 然后,我们必须修改自定义适配器,以便处理图像和holder类 。 持有人类别变为:

private static class PlanetHolder {
    public TextView planetNameView;
    public TextView distView;
    public ImageView img;
}

适配器变为:

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;

    PlanetHolder holder = new PlanetHolder();

    // First let's verify the convertView is not null
    if (convertView == null) {
        // This a new view we inflate the new layout
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.img_row_layout, null);
        // Now we can fill the layout with the right values
        TextView tv = (TextView) v.findViewById(R.id.name);
        TextView distView = (TextView) v.findViewById(R.id.dist);
        ImageView img = (ImageView) v.findViewById(R.id.img);

        holder.planetNameView = tv;
        holder.distView = distView;
        holder.img = img;

        v.setTag(holder);
    }
    else 
        holder = (PlanetHolder) v.getTag();

    System.out.println("Position ["+position+"]");
    Planet p = planetList.get(position);
    holder.planetNameView.setText(p.getName());
    holder.distView.setText("" + p.getDistance());

    holder.img.setImageResource(p.getIdImg());

    return v;
}

这样,对于ListView中的每一行,我们不仅在TextView中设置了行星名称,还在ImageView中设置了相对于行星的图像。 如果我们运行该应用程序,我们将具有以下内容:

好吧,我没有为行星使用正确的图像,这只是向您展示如何使用图像的一种方式! 您必须调整大小并在应用程序中使图像更好!

现在,如果您单击某个项目,则会得到ClassCastException 。 为什么? 好吧,您尝试在onItemClick方法内部将RelativeLayout强制转换为TextView,这是不可能的。

处理用户项目点击

如果要处理用户单击每个项目,则必须在lv.setOnItemClickListener方法中修改代码。 首先,我们必须找到用户选择的商品位置,我们可以做到这一点,或者在public void onItemClick(AdapterView <?> parentAdapter,View view,int position,long id)中使用position参数,也可以向因此,以这种方式找到合适的位置:

int pos = lv.getPositionForView(view);

通过这种方式,我们知道用户单击的项目的位置。 知道信息后,提取信息就非常简单,因为只需引用项目数组即可:

Planet planet =  aAdpt.getItem(pos);

因此,当用户单击ListView内的项目时,我们有:


翻译自: https://www.javacodegeeks.com/2013/06/android-listview-custom-adapter-with-imageview.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值