Android之listview新增資料篇
一、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;
}
} );
}
}