在ListView中经常用到适配器Adapter,
android提供的三种Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是简单的字符串适配器,在实际项目中很少会用到(功能太有限),SimpleAdapter可以自定义ListView的每个Item的布局,一般在简单的布局中会考虑使用,而SimpleCursorAdapter主要用于数据库,前两个的数据来源一般都是String[]或者List,后一个的数据来源一般是数据库查询得到的Cursor。
每个Item的布局文件如下:
最终的运行效果如下:
在实际的项目中,尤其listView的每个Item的布局比较复杂的时候,我们一般都要自定义自己的Adapter,要实现自己的Adapter,我们需要继承BaseAdapter类,同时要覆写其中的四个方法:
public int getCount() :该方法返回ListView中要显示的子View的数量;
public Object getItem(int position):该方法返回一个子View,即listView中的一个子条目,也可以返回自己想要的信息。
public long getItemId(int position):该方法根据Item在listview中的位置,返回其id;
public View getView(int position, View convertView, ViewGroup parent) :该方法是最重要的,也是最难理解的了,它返回的是id为position的Item布局文件对应的View,该View中的各组件可以在getView方法中配置其显示。
这里还有一个点需要说明,就是LayoutInflater类,它的inflate()方法可以根据布局文件获得其View返回值,接下来我们就可以取得该View中的各个组件,便可以为其设置资源,从而配置其显示。
一个简单的自定义实现Adapter的代码类如下:
package com.example.activity;
import com.example.activity.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MenuActivity extends Activity {
private ListView list = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
list = (ListView)findViewById(R.id.list);
MyAdapter mAdapter = new MyAdapter();
list.setAdapter(mAdapter);
}
//自定义Adapter
class MyAdapter extends BaseAdapter{
int[] images = new int[]{
R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,
R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,
R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,
R.drawable.ic_launcher
};
String[] names = new String[]{
"干锅兔肉","水煮牛肉","剁椒鱼头","腊牛肉","藏香鸡",
"蒜茸蒸茄子","小炒肚丝","鳝鱼煨黄瓜","养生健康汤","鲜鱼汤"
};
String[] prices = new String[]{
"28","32","28","32","32",
"28","28","26","20","30"
};
@Override
public int getCount() {
// TODO Auto-generated method stub
return names.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//该方法返回整个Item的布局View
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
//根据布局文件获取其view返回值
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_adapter, null);
}
//获取listview中每个Item布局文件中的的子组件的ID
ImageView image = (ImageView)convertView.findViewById(R.id.image);
TextView name = (TextView)convertView.findViewById(R.id.name_course);
TextView price_number = (TextView)convertView.findViewById(R.id.price_number);
//为对应的Item中的各个组件设置资源,从而配置其显示
image.setImageResource(images[position]);
name.setText(names[position]);
price_number.setText(prices[position]);
return convertView;
}
}
}
每个Item的布局文件如下:
<?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="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:src="@drawable/ic_launcher"
android:layout_marginTop="3dip" />
<TextView
android:id="@+id/name_course"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dip"
android:layout_marginTop="5dip"
android:text="水煮活鱼"
android:layout_below="@id/image"
android:textSize="16sp"/>
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/image"
android:layout_marginLeft="15dp"
android:layout_toRightOf="@+id/name_course"
android:text="价格:"
android:textSize="22sp" />
<TextView
android:id="@+id/price_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/name_course"
android:layout_centerHorizontal="true"
android:text="48元"
android:textSize="22sp"/>
</RelativeLayout>
最终的运行效果如下: