一.SimpleAdapter与baseAdapter的区别
它们两都是Android里的适配器,充当数据和界面之间的桥梁,用SimpleAdapter、baseAdapter的实现效果都几乎是一样,SimpleAdapter适配器使用的数据结构是HashMap,这意味着,如果需要操作的数据对象结构过于复杂时,需要写大量的相关转化代码,程序的效率和可维护性都会变的很低,但是它完全不用考虑缓存弄到应用程序卡死的问题,而且代码会与页面代码耦合,无法切换页面,反过来baseAdapter却是需要写清除缓存代码的,而且baseadapter代码会相对来说会简洁清晰页面与代码不会耦合,所以使用baseadapter会让代码变得简捷效率更加灵活操作
二.SimpleAdapter的使用
MainActivity.java(ps:这里的代码只提供参考学习,布局代码就不一一列举出来了!)
public class MainActivity extends Activity { private SimpleAdapter sa; private ListView lv; private List<Map<String,Object> > messageList = new ArrayList<Map<String,Object>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weixin); //模拟读取数据库或者互联网 for (int i = 0; i < 1000; i++) { //定义一个界面与数据的混合体,一个item代表一行记录 Map<String,Object> item = new HashMap<String,Object>(); //一行记录,包含多个控件 item.put("tou", R.drawable.tou1); item.put("userName", "姓名"+i); item.put("lastMessage", "内容"); item.put("datetime","11月28日"); messageList.add(item); } lv = (ListView)findViewById(R.id.listView1); sa = new SimpleAdapter(this, messageList,//data 不仅仅是数据,而是一个与界面耦合的数据混合体 R.layout.listview_item_layout, new String[] {"tou","userName","lastMessage","datetime"},//from 从哪里来 new int[] {R.id.imageView1,R.id.tv_userName,R.id.tv_lastMessage,R.id.tv_datetime}//to 到那里去 ); lv.setAdapter(sa); lv.setOnItemClickListener(new OnItemClickListener() { //为Item配置单击监听,单击时改变姓名并吐司 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map<String,Object> item = messageList2.get(position); item.put("userName", "名字"+position); sa.notifyDataSetChanged(); Toast.makeText(MainActivity.this, (String)item.get("userName"), Toast.LENGTH_SHORT).show(); } }); } }
三.baseAdapter的使用
MainActivity.java(ps:这里的代码只提供参考学习,布局代码就不一一列举出来了!)
public class MainActivity extends Activity { private ListView lv; private List<Message> messageList = new ArrayList<Message>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weixin); //模拟读取数据库或者互联网 for (int i = 0; i < 1000; i++) { Message m = new Message(); m.setTou1("xxx"); m.setUserName("姓名"+i); m.setLastMessage("内容"); m.setDatetime("11月28日"); messageList.add(m); } lv = (ListView)findViewById(R.id.listView1); //简单理解为VC绑在一起 // baseAdapter,店长五星级推荐 lv.setAdapter( new BaseAdapter(){ //返回多少条记录 @Override public int getCount() { // TODO Auto-generated method stub return messageList.size(); } //每一个item项,返回一次界面 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; //布局不变,数据变 //如果缓存为空,我们生成新的布局作为1个item if(convertView==null){ Log.i("info:", "没有缓存,重新生成"+position); LayoutInflater inflater = MainActivity.this.getLayoutInflater(); //因为getView()返回的对象,adapter会自动赋给ListView view = inflater.inflate(R.layout.listview_item_layout, null); }else{ Log.i("info:", "有缓存,不需要重新生成"+position); view = convertView; } Message m = messageList.get(position); TextView tv_userName = (TextView)view.findViewById(R.id.tv_userName); tv_userName.setText( m.getUserName() ); tv_userName.setTextSize(15); TextView tv_lastMessage = (TextView)view.findViewById(R.id.tv_lastMessage); tv_lastMessage.setText( m.getLastMessage() ); tv_lastMessage.setTextSize(12); TextView tv_datetime = (TextView)view.findViewById(R.id.tv_datetime); tv_datetime.setText( m.getDatetime() ); tv_datetime.setTextSize(12); return view; } @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 0; } } ); } }
以上就是我对SimpleAdapter、baseAdapter适配器的理解