ListView显示列表数据,内容可以简单的就是一行行的字符串,也可以复杂到每一行数据就是包含特定排版格式的数字、字符串、图像等的组合。
简单的纯字符串的ListView的使用方法如下:
1.先引用在布局中设计好的ListView组件:
ListView listView=(ListView) findViewById(R.id.list_view_xxx);
2.准备好ListView要使用的字符串数据,由于字符串好多个(一行一行的),所以字符串数据要封装在ArrayAdapter中:例如:
String[] data={"Apple","Samsung","Huawei","Xiaomi","Oppo"}
ArrayAdapter<String> adatpter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,data);
3.listview组件使用数据:
listView.setAdapter(adapter);
总结一下:从简单数据的ListView可以看出:ListView需要的数据必须封装在ArrayAdapter里面,而ListView怎么显示数据也不是ListView决定的,而是由这个ArrayAdapter决定。
因此,要实现复杂数据的列表显示,我们需要做的主要有两步:
1.定义这个复杂数据
2.定义这个新的ArrayAdapter,当然,新的ArrayAdapter一定派生自ArrayAdapter。
暂停一下,了解一下ArrayAdapter构造函数的三个参数:
new ArrayAdapter(context,resource_id,data)
分别是adapter的上下文,显示数据的layout和数据。对于字符串等简单数据,安卓系统内置了一些简单的布局可以显示数据,比如上面的:android.R.layout.simple_list_item_single_choice,其他还有什么:android.R.layout.simple_list_item_1等等。
下面就是扩展了:
比如我们要显示的数据包含:
1.商品图片
2.商品名称
3.商品描述
4.商品价格
每一行数据类似手机淘宝的搜索结果一样:
要把这样的数据显示在ListView里面,当让首先需要定义这样的一个数据:
public class Commodity{
private String name;
private int resource_id;
private String discription;
private float price;
public Commodity(String name,int resource_id,String discreption,float price){
this.name=name;
this.resource_id=resource_id;
this.discription=discription;
this.price=price;
}
public String getName(){
return name;
}
...此处省略其他类似的getXXX函数
}
第二步,新建一个水果列表类,这个类派生自ArrayAdapter
public class CommodityArrayAdapter extends ArrayAdapter<Commodity> {
private int resourceID; //显示数据的layout 的id
//注意,类名定义里面定义了这个ArrayAdapter的每一个数据是我们定义的商品类的数据
//接着定义构造函数,显然应该包含我们上满总结的三个参数
//其中注意data的定义,要将Commodity类型的数据装配为列表型里面才可以,简单类型可以如String[],复杂结构体数据必须借助List类,后面讲这个
public CommodityArrayAdapter(Context context,int resource_id,List<Commodity>data){
super(context,resource_id,data);
resourceID=resource_id;
}
//关键的一个函数,getView(),是父类的重写.这个函数负责填写我们设计的数据显示页面(这个页面就是一个layout,记得上面写的resource_id这个参数吗)
@Override
public View getView(int position, View convertView, ViewGroup parent){
Commodity commodity=getItem(position);//这个position就是列表每一个数据的索引位置
View view;
ViewHolder viewHolder;//ViewHolder的用处看:[这里](https://www.jianshu.com/p/a14feb480804)
if(convertView==null){
view = LayoutInflater.from(getContext()).inflate(resourceID, parent, false); //Layout inflation是在android系统中使用的术语,当XML布局资源被解析并转换成View对象时会用到.
viewHolder = new ViewHolder();
//下面把显示布局里面的显示组件绑定到ViewHolder里面
ImageView commodityImage= (ImageView) view.findViewById (R.id.commodity_image);
ViewHolder.commodityName = (TextView) view.findViewById (R.id.commodity_name);
ViewHolder.commodityImage= (TextView) view.findViewById (R.id.commodity_image);
ViewHolder.commodityDiscription= (TextView) view.findViewById (R.id.commodity_discription);
ViewHolder.commodityPrice= (TextView) view.findViewById (R.id.commodity_price);
view.setTag(viewHolder)
}
else{
view=convertView;
viewHolder=(ViewHolder) view.getTag();
}
commodityImage.setImageResource(commodity.getImage());
//..以下雷同
commodityName.setText(commodity.getName());
return view;
}
}
//这里定义一下ViewHolder
class ViewHolder{
ImageView commodityImage;
TextView commodityName;
TextView commodityDiscription;
TextView commodityPrice;
}
所有的数据类型都搞定了。下面需要准备的包括:
1.准备数据,包括文本数据:产品名称、描述、价格。还有图片数据,建议保存在res\drawable目录下,图片名称不支持中文
2.设计一个layout,用来显示一个商品数据。
OK,现在搞定。可以像普通数据那样的步骤来在ListView中显示这些数据了。运行结果如下
: