一.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適配器的理解