SimpleAdapter
SimpleAdapter是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。
SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int [] to)
参数说明:
context: SimpleAdapter关联的View的运行对象
data: 一个Map组成的List数据结构,在列表中的每个条目对应列表中的一行,每一个Map中应该包含所有在from参数中指定的键(Key)
resource: 一个定义列表项的布局文件的资源ID,布局文件将至少包含那些在to中定义的ID
from: 一个将被添加到Map映射上的键名(key)
to: 将绑定数据的视图的ID(map中的value),跟from对数对应,并且应该是view
在ListView中使用样例:
List< Map<String, Object> > listItems = new ArrayList< Map<String, Object> >(); for ( int i = 0 ; i < files.length; ++ i ) { Map<String, Object> itemMap = new HashMap<String, Object>(); if ( files[i].isDirectory() ) { itemMap.put("icon" , R.drawable.folder); } else if ( files[i].isFile() ) { itemMap.put("icon" , R.drawable.file); } itemMap.put("fileName" , files[i].getName()); listItems.add(itemMap); } SimpleAdapter simpleAdapter = new SimpleAdapter( this , listItems, R.layout.line, new String[]{ "icon" , "fileName" }, new int []{R.id.icon, R.id.file_name}); listView.setAdapter(simpleAdapter);
new String[]{"icon", "fileName"} 是 构造函数中的 from 他表示了我的map里面键值对key只有icon、fileName这两个key
new int[]{R.id.icon, R.id.file_name} 是 构造函数中的 to 他表示了我map里面键值对value的资源ID
R.layout.line 是 构造函数中的 resource 他表示一个资源文件
内容如下:
line.xml
<?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/icon" android:layout_width="40dp" android:layout_height="40dp" android:paddingLeft="10dp" android:src="@drawable/abc_ab_bottom_solid_dark_holo" /> <TextView android:id="@+id/file_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingBottom="10dp" android:paddingLeft="10dp" android:paddingTop="10dp" android:textSize="16dp" /> </LinearLayout>
里面要包括from和to里面的内容。
ArrayAdapter
ArrayAdapter 数组适配器,一般用于显示一行文本信息,相对比较简单,默认的ArrayAdapter期望接受的样式文件只含有一个textview,然后它把
接受到的数据toString显示出来,但是他有6个构造函数(够多的呀),我们挑几个复杂常用点的介绍:
ArrayAdapter(Context context, int resource) ArrayAdapter(Context context, int resource, int textViewResourceId)
之所以把上面两个构造函数放一起说,是因为其实他们可以当成一体的,看下面例子:
ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , android.R.layout.simple_expandable_list_item_1); adapter.add("string1" ); adapter.add("haha" ); adapter.add("heihei" ); listview.setAdapter(adapter);
android.R.layout.simple_expandable_list_item_1为android自己提供的样式,
当然我们可以换成我们自己的样式,看下面:
<TextView xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/online_user_list_item_textview" > </TextView>
有没有发觉这个xml文件有什么不同?是的,他没有布局,如果使用上面的ArrayAdapter(Context context, int resource)构造函数,那么对应的xml资
源 文件仅只能有一个TextView,那么我们非要使用多个控件,还要使用布局怎么办?使用上面第二个构造函数, 他的第三个参数就是用来指定TextView
的, 看 下面布局文件:
<?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/online_user_list_item_textview" android:text="TextView" ></TextView> <Button android:text="button" android:layout_width="wrap_content" android:layout_height="wrap_content" > </Button> </LinearLayout>
里面含有的textview是我们想要显示内容的地方,那么我们改成下面代码就好了
ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , R.layout.online_user_list_item, R.id.online_user_list_item_textview);
简单的构造函数介绍完了,看看稍微复杂点的。
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) ArrayAdapter(Context context, int resource, List<T> objects)
context:关联的对象
resource:资源文件ID
List: 一个list对象
上面这两个构造函数和最开始的介绍的一样,相差无异,只是多了一个textviewid,这样就意味着可以使用复杂的资源xml文件,只需要告诉
textview的id就ok了,看下面的例子。
我们在一个布局xml资源中放置一个ImageView,一个TextView,内容如下:
list_item.xml 文件
<?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
使用代码只需要更改成如下:
private ArrayList<String> list = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); lv = (ListView)findViewById(R.id.listview); ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , R.layout.list_item, R.id.tv, getData()); lv.setAdapter(adapter); } private ArrayList<String> getData() { list.add("180平米的房子" ); list.add("一个勤劳漂亮的老婆" ); list.add("一辆宝马" ); list.add("一个强壮且永不生病的身体" ); list.add("一个喜欢的事业" ); return list; }
这样就实现一个带上图片+文字的list列表了,效果看上去和SimpleAdapter差不多,但是不如SimpleAdapter灵活。如果要实现更复杂的效果就要
重载ArrayAdapter中的getView()函数了,这里不给出来,请看下面链接: http://blog.csdn.net/nairuohe/article/details/6457300 http://www.cnblogs.com/sayo/archive/2010/12/30/1922590.html http://www.cnblogs.com/xirihanlin/archive/2009/08/03/1537609.html http://blog.csdn.net/andie_guo/article/details/12554321 此链接重写实现了AutoComplete功能 那还不如直接使用BaseAdapter,全部重写,下面就来看看BaseAdapter
BaseAdapter
它是直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,但是这会涉及到ListView优化等问题了。 使用BaseAdapter就需要继承他,然后重写里面的许多方法。
class MyAdapter extends BaseAdapter { private Context context; public MyAdapter(Context context) { this .context = context; } @Override public int getCount() { return 0 ; } @Override public Object getItem( int position) { return null ; } @Override public long getItemId( int position) { return 0 ; } @Override public View getView( int position, View convertView, ViewGroup parent) { return null ; } }
这里面没什么难度,但是这个getView方法必须好好处理,也是最麻烦的
第一种:没有任何处理,不建议这样写。如果数据量少还可以凑合,但是如果列表项数据量很大的时候,会每次都重新创建View,设置资源,严重影响性
能, 所以从一开始就不要用这种方式:
@Override public View getView( int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.layout.list_item, null ); ImageView img = (ImageView)item.findViewById(R.id.img) TextView title = (TextView)item.findViewById(R.id.title); TextView info = (TextView)item.findViewById(R.id.info); img.setImageResource(R.drawable.ic_launcher); title.setText("Hello" ); info.setText("world" ); return item; }
第二种ListView优化:通过缓存convertView,这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中
的View, 提升了性能:
public View getView( int position, View convertView, ViewGroup parent) { if (convertView == null ) { convertView = mInflater.inflate(R.layout.list_item, null ); } ImageView img = (ImageView)convertView.findViewById(R.id.img) TextView title = (TextView)convertView.findViewById(R.id.title); TextView info = (TextView)ConvertView.findViewById(R.id.info); img.setImageResource(R.drawable.ic_launcher); title.setText("Hello" ); info.setText("world" ); return convertView; }