1、ListView:java
一、 ListView一般有兩個職責:android
一、向佈局填充數據數據庫
二、處理選擇點擊等操做緩存
二、ListView的建立須要3個元素:微信
一、 ListView中的每一列的View。數據結構
二、 填入View的數據或者圖片等。ide
三、鏈接數據與ListView的適配器佈局
三、適配器:this
①首先咱們能夠經過一張圖來解釋適配器的做用。spa
②適配器是一個鏈接數據和AdapterView(ListView就是一個典型的AdapterView)的橋樑,經過它能有效地實現數據與AdapterView的分離設置,咱們能夠理解爲適配器就是數據和視圖之間的橋樑,經過轉換方式將將複雜的數據轉化爲簡單的View。簡單來講就是一種轉換方式將不能用的轉換爲能夠用的。
常見的適配器:
四、SimpleAdapter與baseAdapter的區別:
它們兩都是Android裏的適配器,充當數據和界面之間的橋樑,用SimpleAdapter、baseAdapter的實現效果都幾乎是同樣,SimpleAdapter適配器使用的數據結構是HashMap,這意味着,若是須要操做的數據對象結構過於複雜時,須要寫大量的相關轉化代碼,程序的效率和可維護性都會變的很低,可是它徹底不用考慮緩存弄到應用程序卡死的問題,並且代碼會與頁面代碼耦合,沒法切換頁面,反過來baseAdapter倒是須要寫清除緩存代碼的,並且baseadapter代碼會相對來講會簡潔清晰頁面與代碼不會耦合,因此simpleadapter相對於這個Baseadapter來講呢,就有點太 多的限制。使baseadapter會讓代碼變得簡捷效率更加靈活操做!(注:)
2、編寫代碼:
效果圖:
一、結合上一章微信佈局咱們知道中間部分是用來動態添加數據的,根據上面這張圖片咱們知道須要一張圖片和3個顯示文字的控件和顯示最右邊的消息圖標的控件。
二、因此咱們又添加一個佈局對中間部分進行佈局,顯示一項一項(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>
一、咱們經過ImageView設置左邊圖片。
二、經過2個TextView控件分別顯示名字和內容,而且將這2個控件用LinearLaout佈局一下。
三、添加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類型佈局設置圓形圖標。
效果圖片:
四、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; } } ); } }
一、定義一個List<messages>集合用來存儲添加的數據。
二、經過ListView的setAdapter設置BaseAdapter顯示的View。
三、經過相關的控件set屬性設置值,經過get屬性獲取值。
四、經過View getView()方法進行界面佈局。
四、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; } } ); } }