ArrayAdapter, SimpleAdapter 和BaseAdapter的使用范例
2014-09-01 16:06
288 查看
一、ArrayAdapter:最简单地布局,显示一行内容 (可以配上图片文字一起显示)
曾经以为ArrayAdapter只能显示一行文字,后来发现它可以将图片和文字一起显示,不过缺点就是只能定义一项,不能同时定义。
二、SimpleAdapter:看名字就知道是简单地布局,扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等。可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示,例如View的Item里有按钮,点击后是没有效果的。
使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局imagelayout.xml。
三、BasaAdapter的使用和参数
这是最受欢迎的Adapter吧,当系统开始绘制ListView的时候,首先开始调用getCount()方法,得到它的返回值,这个值就是ListView的长度,然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。如果让getCount()的参数返回为1 ,那么只会显示一行。但如果有1000行,系统会不会绘制一千行呢?肯定不会,那样太消耗内存了,所以会通过convertView和ViewHolder直接导入布局,并且设置控件显示的内容就可以了,View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。如果List中有button,记得提前设置获取焦点:setFoucsable="true"(详细可度娘下)。
继承了BaseAdapter之后需要复写四个方法,分别说明如下:
public class ImageListView extends Activity { private ListView mListView; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mListView = new ListView(this); mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item, getData()));//此处采用的是系统提供的样式 setContentView(mListView); } private List<String> getData(){ List<String> data = new ArrayList<String>(); data.add("百度图片"); data.add("腾讯图片"); data.add("360图片"); return data; } }
曾经以为ArrayAdapter只能显示一行文字,后来发现它可以将图片和文字一起显示,不过缺点就是只能定义一项,不能同时定义。
public class ImageListView extends Activity { private ListView mListView; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mListView = new ListView(this); <pre name="code" class="java"><span style="white-space:pre"> </span>mListView.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item , R.id.textView , list ));setContentView(mListView); } } //参数说明:this就不用解释了;R.layout.list_item是我们自己定义的布局,里边可以有图片等,不过只能是固定的,R.id.textView是需要改变的文字id;list就是需要显示的文字集合,同理可以文字不变,改变图片亦可。
二、SimpleAdapter:看名字就知道是简单地布局,扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等。可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示,例如View的Item里有按钮,点击后是没有效果的。
使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局imagelayout.xml。
public class ImageListView extends ListActivity { 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", "tp"); map.put("info", "fb"); map.put("img", R.drawable.icon); mList.add(map); map = new HashMap<String, Object>(); map.put("title", "tp2"); map.put("info", "fb2"); map.put("img", R.drawable.icon2); mlist.add(map); return mlist; } }
三、BasaAdapter的使用和参数
这是最受欢迎的Adapter吧,当系统开始绘制ListView的时候,首先开始调用getCount()方法,得到它的返回值,这个值就是ListView的长度,然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。如果让getCount()的参数返回为1 ,那么只会显示一行。但如果有1000行,系统会不会绘制一千行呢?肯定不会,那样太消耗内存了,所以会通过convertView和ViewHolder直接导入布局,并且设置控件显示的内容就可以了,View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。如果List中有button,记得提前设置获取焦点:setFoucsable="true"(详细可度娘下)。
继承了BaseAdapter之后需要复写四个方法,分别说明如下:
public int getCount(){ return XX.size(); }<span style="font-family: Arial, Helvetica, sans-serif;">//当系统开始绘制listView的时候便开始调用此方法,返回值就是ListView的长度,如果本来是10行,设置返回值为6,那么就只能显示6行了,一般都会return XX.size()或者XX.length()</span>
public Object getItem(int position){ return XX.get(position); }//返回当前Item对象的本身,方便在Activity中的onItemClick方法中调用
public long getItemId(int position){ return position; }//返回当前选择Item的id,方便调用。getItem和getItemId是一对基友关系,前者返回的是对象本身,后者返回的是该对象的索引。
public View getView(int postion , View converView, ViewGroup parent){ return converView; }//<span style="font-family: Arial, Helvetica, sans-serif;">converView是每一行的View;</span>一大波代码来袭:
public class ImageListView extends ListActivity { private List<Map<String, Object>> mData; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mData = getData(); ImageBaseAdapter adapter = newImageBaseAdapter(this); setListAdapter(adapter); } private List<Map<String, Object>> getData() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "tp"); map.put("info", "fb"); map.put("img", R.drawable.icon); list.add(map); map = new HashMap<String, Object>(); map.put("title", "tp1"); map.put("info", "fb2"); map.put("img", R.drawable.icon2); list.add(map); return list; } protected void onListItemClick(ListView l, View v, int position, long id) { } public void showInfo(){ new AlertDialog.Builder(this) .setTitle("listview") .setMessage("介绍...") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } public final class ViewHolder{ public ImageView img; public TextView title; public TextView info; public Button viewBtn; } public class ImageBaseAdapter extends BaseAdapter{ private LayoutInflater mInflater; public ImageBaseAdapter(Context context){ this.mInflater = LayoutInflater.from(context); } public int getCount() { return mData.size(); } public Object getItem(int position) { return mData.get(position); } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder=new ViewHolder(); convertView = mInflater.inflate(R.layout.vlist, null);//注意,这里第一个参数是文件名,而不是ID,小心容易出错 holder.img = (ImageView)convertView.findViewById(R.id.img); holder.title = (TextView)convertView.findViewById(R.id.title); holder.info = (TextView)convertView.findViewById(R.id.info); holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); } holder.img.setBackgroundResource((Integer)mData.get(position).get("img")); holder.title.setText((String)mData.get(position).get("title")); holder.info.setText((String)mData.get(position).get("info")); holder.viewBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showInfo(); } }); return convertView; } } }
相关文章推荐
- Android实例demo11之listview的简单使用(arrayadapter、simpleadapter)
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
- Android学习---ListView的点击事件,simpleAdapter和arrayadapter的原理和使用 - Hi_Amos
- ArrayAdapter和SimpleAdapter简单使用
- ListView的使用----ArrayAdapter与SimpleAdapter
- SimpleAdapter 和 ArrayAdapter使用详解
- android Adapter综合使用(ArrayAdapter、SimpleAdapter、BaseAdapter在ListView和GridView中的使用)
- AdapterView及其子类之二:使用ListActivity及ArrayAdapter创建列表
- ListView的Adapter使用 之 初学ArrayAdapter<String>
- Android SimpleAdapter,SimpleCursorAdapter,ArrayAdapter的区别
- AdapterView及其子类之二:使用ListActivity及ArrayAdapter创建列表
- android ArrayAdpater, BaseAdapter,SimpleAdapter,以及CursorAdapter
- android中ListView+ArrayAdapter简单使用
- bak 2.android spinner配合ArrayAdapter使用.
- Android 之 ListView使用ArrayAdapter展示列表
- AdapterView及其子类之二:使用ListActivity及ArrayAdapter创建列表 分类: H1_ANDROID 2013-11-19 22:01 1248人阅读 评论(0) 收藏
- (转)Android杂谈--ListView之ArrayAdapter的使用
- [Android开发]ArrayAdapter的使用
- Android 之 ListView使用ArrayAdapter展示列表
- SimpleAdapter 和 SimpleCursorAdapter的使用