我们常用的Adapter有三种:
1)ArrayAdapter
2) SimpleAdapter
3) BaseAdapter
一 :ArrayAdapter
如果我们只是简单的展示文字列表,比如说联系人,文章列表等,这个是最好的选择。
用法:
main.xml
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" ...="" tools:context=".MainActivity">
<listview android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true">
</listview>
</relativelayout>
MainActivity:
public class MainActivity extends Activity {
private ListView mListView;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mListView = (ListView)findViewById(R.id.listView1);
mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item, getData()));
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("小王");
data.add("小李");
data.add("小张");
return data;
}
}
关键部分重要是ArrayAdapter构造方法的三个参数
第一个是Context ,第二个是每一行数据展示的布局方式,第三个就是数据源,是一个List或者Array,里面每一个元素对应ListView一行数据。
android.R.layout.simple_list_item是安卓系统给定的布局样式。
二,SimpleAdapter
前面ArrayAdapter 主要是用于显示单行文本,而SimpleAdapter则扩展性更好,每一行可以定义出各种布局风格,数据源包装形式是List<Map<String, Object>>
其中每一个HashMap构成的List对应列表的每一行,list中每一节中Map<String,Object>对应一个组件。
public class ImageListView extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.imagelayout,
new String[]{"title","info","img"},
new int[]{R.id.title,R.id.info,R.id.img});
setListAdapter(adapter);
}
private List<Map<String, Object>> getData() {
List<Map<String, Object>> mList = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "小王");
map.put("info", "北京");
map.put("img", R.drawable.icon);
mList.add(map);
map = new HashMap<String, Object>();
map.put("title", "小李");
map.put("info", "武汉");
map.put("img", R.drawable.icon2);
list.add(map);
return list;
}
}
SimpleAdapter构造方法四个参数,第一个是Context 上下文,第二个是数据源,是包含Map对象的list,第三个参数是每一行各个组件的布局文件,第四个,第五个参数是一种映射,将数据源中Map的Key值与布局文件layout的id对应起来。
三,BaseAdapter
前面SimpleAdapter已经能自定义列表格式,扩展性很好,那为什么还要有一个BaseAdapter呢?这里你要考虑SimpleAdapter加载的每一行布局只是单纯的把布局文件引用过来,这个布局不是我们当前显示的主页面的布局,仅仅是定义列表每一行的布局,往往没有经过“实例化”,上面imagelayout布局中的组件只用于显示,不能添加附加操作,比如我们映射一个按钮,想要响应按钮的点击事件,但是没有办法用findViewByid,实例化按键,所以想要添加按键响应必须去重写SimpleAdapter类,在getView里面去获得按键,添加响应事件,其实如果是这样,用法和BaseAdapter一样了。
java代码里:(将手机app图标和名称以gridView形式展示)
private List<ResolveInfo> gridlist;
mdapter = new Launcher_Grid_adapter(this, gridlist);
gridview.setAdapter(mdapter);
gridview.setOnItemClickListener(new ItemClickListener());
public class Launcher_Grid_adapter extends BaseAdapter
{
private List<ResolveInfo> mApps ;
private Context context ;
private LayoutInflater mInflate ;
public Launcher_Grid_adapter(Context context ,List<ResolveInfo> apps)
{
super();
this.context = context ;
mInflate = LayoutInflater.from(context);
this.mApps = apps ;
}
@Override
public int getCount() {
return mApps.size();
}
@Override
public Object getItem(int position)
{
return mApps.get(position);
}
@Override
public long getItemId(int position)
{
return position ;
}
@Override
public View getView(int position ,View convertView , ViewGroup parent)
{
ViewHolder holder ;
if(convertView == null)
{
holder = new ViewHolder();
convertView = mInflate.inflate(R.layout.grid_adapter, null);
holder.iv=(ImageView)convertView.findViewById(R.id.ItemImage);
holder.tv = (TextView)convertView.findViewById(R.id.ItemText);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
ResolveInfo info = mApps.get(position);
holder.iv.setImageDrawable(info.activityInfo.loadIcon(context.getPackageManager()));
String text = (String) info.activityInfo.loadLabel(context.getPackageManager());
holder.tv.setText(text);
return convertView;
}
}
class ViewHolder
{
TextView tv ;
ImageView iv ;
}
grid_adapter.xml
<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/ItemImage"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:contentDescription="@string/app_name"/>
<TextView
android:id="@+id/ItemText"
android:layout_below="@id/ItemImage"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:layout_marginTop="10dp"
android:maxEms="12"
android:singleLine="true"
android:ellipsize="end"
android:textColor="#ffff0000"
/>
</RelativeLayout>
getView根据getCount返回的个数,调用对应次数,绘制每一行。
这里用到了ViewHolder缓存机制,增加UI响应速度。这里不做说明。