一、ListView:
1、 ListView通常有兩個職責:
1、向布局填充數據
2、處理選擇點擊等操作
2、ListView的創建需要3個元素:
1、 ListView中的每一列的View。
2、 填入View的數據或者圖片等。
3、連接數據與ListView的適配器
3、適配器:
①首先我們可以通過一張圖來解釋適配器的作用。
②適配器是一個連接數據和AdapterView(ListView就是一個典型的AdapterView)的橋梁,通過它能有效地實現數據與AdapterView的分離設置,我們可以理解為適配器就是數據和視圖之間的橋梁,通過轉換方式將將復雜的數據轉化為簡單的View。簡單來說就是一種轉換方式將不能用的轉換為可以用的。
常見的適配器:
4、SimpleAdapter與baseAdapter的區別:
它們兩都是Android里的適配器,充當數據和界面之間的橋梁,用SimpleAdapter、baseAdapter的實現效果都幾乎是一樣,SimpleAdapter適配器使用的數據結構是HashMap,這意味着,如果需要操作的數據對象結構過於復雜時,需要寫大量的相關轉化代碼,程序的效率和可維護性都會變的很低,但是它完全不用考慮緩存弄到應用程序卡死的問題,而且代碼會與頁面代碼耦合,無法切換頁面,反過來baseAdapter卻是需要寫清除緩存代碼的,而且baseadapter代碼會相對來說會簡潔清晰頁面與代碼不會耦合,所以simpleadapter相對於這個Baseadapter來說呢,就有點太 多的限制。使baseadapter會讓代碼變得簡捷效率更加靈活操作!(注:)
二、編寫代碼:
效果圖:
1、結合上一章微信布局我們知道中間部分是用來動態添加數據的,根據上面這張圖片我們知道需要一張圖片和3個顯示文字的控件和顯示最右邊的消息圖標的控件。
2、所以我們又添加一個布局對中間部分進行布局,顯示一項一項(item)的數據。
中間2: listviewitems
listviewitems.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/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:src="@drawable/tabbar_mainframe" /> <LinearLayout android:layout_weight="1" android:layout_width="match_parent" android:layout_height="80dp" android:orientation="vertical" android:layout_margin="5dp" > <TextView android:id="@+id/tv_userName" android:layout_width="match_parent" android:layout_height="20dp" /> <TextView android:id="@+id/tv_lastMessage" android:layout_width="match_parent" android:layout_height="15dp" /> </LinearLayout> <TextView android:id="@+id/tv_datetime" android:layout_width="150dp" android:layout_height="15dp" /> <TextView android:id="@+id/img" android:layout_width="25dp" android:gravity="center" android:layout_height="25dp" android:background="@drawable/tubiao" /> </LinearLayout>
1、我們通過ImageView設置左邊圖片。
2、通過2個TextView控件分別顯示名字和內容,並且將這2個控件用LinearLaout布局一下。
3、添加2個TextView控件分別顯示時間和圖片,通過背景圖片設置。
tubiao.xml文件:(設置圓形圖標)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" android:useLevel="false" > <solid android:color="#eee" /> <padding android:left="2dp" android:top="1dp" android:right="2dp" android:bottom="1dp" /> <solid android:color="#FF0000" /> <stroke android:width="1dp" android:color="#ccc" /> <size android:width="60dp" android:height="60dp" /> </shape>
通過shape類型布局設置圓形圖標。
效果圖片:
4、listView 添加數據(baseAdapter適配器)
messages.java文件:
public class messages { private String tou1; private String userName; private String lastMessage; private String datetime; private int id; public String getTou1() { return tou1; } public void setTou1(String tou1) { this.tou1 = tou1; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getLastMessage() { return lastMessage; } public void setLastMessage(String lastMessage) { this.lastMessage = lastMessage; } public String getDatetime() { return datetime; } public void setDatetime(String datetime) { this.datetime = datetime; } public int getIt() { return id; } public void setIt(int id) { this.id = id; } }
我們通過messages來定義一下要顯示的字段。
MainActivity.java文件:
public class MainActivity extends Activity { private SimpleAdapter sa; private ListView lv; private List<messages> messageList = new ArrayList<messages>(); private List<Map<String,Object> > messageList2 = new ArrayList<Map<String,Object> >(); private List<messages> messageList3;//用於ORMLite 的演示 private DatabaseHelper db_helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weixin);
for (int i = 1; i < 101; i++) {
//添加數據
messages m = new messages();
m.setTou1(""+i);
m.setUserName("TT"+i);
m.setLastMessage( "一起去旅游");
m.setDatetime("10月1日");
messageList.add(m);//上周
}
//簡單理解為VC綁在一起
// baseAdapter
lv = (ListView)findViewById(R.id.listView1);
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; } messages 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; } } ); } }
1、定義一個List<messages>集合用來存儲添加的數據。
2、通過ListView的setAdapter設置BaseAdapter顯示的View。
3、通過相關的控件set屬性設置值,通過get屬性獲取值。
4、通過View getView()方法進行界面布局。
4、listView 添加數據(SimpleAdapter適配器)
MainActivity.java文件:
public class MainActivity extends Activity { private SimpleAdapter sa; private ListView lv; private List<messages> messageList = new ArrayList<messages>(); private List<Map<String,Object> > messageList2 = new ArrayList<Map<String,Object> >(); private List<messages> messageList3;//用於ORMLite 的演示 private DatabaseHelper db_helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weixin);
//模擬讀取數據庫或者互聯網
for (int i = 0; i < messageList3.size(); i++) {
//定義一個界面與數據的混合體,一個item代表一行記錄
Map<String,Object> item = new HashMap<String,Object>();
//一行記錄,包含多個控件
item.put("tou", R.drawable.tou1);
item.put("userName", messageList3.get(i).getUserName()+i);
item.put("lastMessage", messageList3.get(i).getLastMessage());
item.put("datetime",messageList3.get(i).getDatetime());
messageList2.add(item);
}
lv = (ListView)findViewById(R.id.listView1);
sa = new SimpleAdapter(this,
messageList2,//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() {
@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();
}
});
} @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; } } ); } }