Android系统自带的ListView控件,能展示的内容有限,往往达不到实际项目开发的要求。想实现图文混合显示,需要自定义ListView并重写Adapter。
本文自定义ListView来展示水果图片、名称及价格
1、定义ListView要展示的fruit类
public class Fruit {
private String name;
private double price;
private int imageID;
public double getPrice() {
return price;
}
public String getName() {
return name;
}
public int getImageID() {
return imageID;
}
public Fruit(String name,int id,double price) {
this.name = name;
this.imageID = id;
this.price = price;
}
public Fruit() {}
}
2、ListView需要Adapter填充内容。这里继承ArrayAdapter,自定义适配器类FruitAdapter
public class FruitAdapter extends ArrayAdapter<Fruit> {
int resourceID;
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceID = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view ;
ViewHolder viewHolder;
//view对象为空时,给它赋值。避免每次findViewById来提高ListView的效率
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceID, null);
viewHolder = new ViewHolder();
viewHolder.fruitimage = (ImageView)view.findViewById(R.id.fruit_image);
viewHolder.fruitname = (TextView)view.findViewById(R.id.fruit_name);
viewHolder.fruitprice = (TextView)view.findViewById(R.id.fruit_price);
view.setTag(viewHolder); //viewholder 存储在view中
}else {
view = convertView;
viewHolder = (ViewHolder)view.getTag();
}
//给ListView中的每一项赋值
viewHolder.fruitimage.setImageResource(fruit.getImageID());
viewHolder.fruitname.setText(fruit.getName());
viewHolder.fruitprice.setText(String.valueOf(fruit.getPrice()));
return view;
}
class ViewHolder{
ImageView fruitimage;
TextView fruitname,fruitprice;
}
}
3、ListView项目的布局xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/fruit_image"
android:layout_width="75sp"
android:layout_height="75sp" />
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="80dip"
android:textSize="20sp"
android:text="apple"
/>
<TextView
android:id="@+id/fruit_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginRight="70dip"
android:text="单价:"
android:textSize="20sp"
/>
</RelativeLayout>
在Activity中显示
public class ListViewActivity extends Activity {
private List<Fruit> fruitlist = new ArrayList<Fruit>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InitFruits();
FruitAdapter adapter = new FruitAdapter(ListViewActivity.this, R.layout.fruit, fruitlist);
ListView list = (ListView)findViewById(R.id.listView);
list.setAdapter(adapter);
}
};
private void InitFruits() {
// TODO Auto-generated method stub
fruitlist.add(new Fruit("Apple", R.drawable.apple512,1.26));
fruitlist.add(new Fruit("Banana", R.drawable.banana512,2.2));
fruitlist.add(new Fruit("Orange", R.drawable.orange512,5.0));
fruitlist.add(new Fruit("Lemon", R.drawable.lemon512,4.3));
fruitlist.add(new Fruit("Pear", R.drawable.pear512,3.5));
fruitlist.add(new Fruit("Tomato", R.drawable.tomato512,2.6));
fruitlist.add(new Fruit("Kiwi", R.drawable.kiwi512,1.9));
fruitlist.add(new Fruit("Peach", R.drawable.peach512,5));
fruitlist.add(new Fruit("Cherry", R.drawable.cherry512,10));
}
实际效果:
待续:
当拖动listview项时,要因图片显示过多,内在溢出程序异常退出,这个问题未解决