Android之listview添加數據篇

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

        } );   
    }
    
}
相關文章
相關標籤/搜索