1. 程式人生 > >Android之listview新增資料篇

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;
            }

        } );   
    }
    
}