在上一篇文章中,我们讨论了自定义适配器。 我们只使用了一个非常简单的适配器和一个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