zoukankan      html  css  js  c++  java
  • 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;
                }
    
            } );   
        }
        
    }

               

  • 相关阅读:
    Windows Mobile 中 Cellular Emulator 与 Device Emulator 连接不上的解决办法?
    Windows Mobile Space Index
    通过Windows Mobile连接管理器建立网络连接
    为Windows mobile编写设计友好的控件[Writing designer friendly controls for Windows Mobile]
    TransparentImage、TransparentBlt [Daliy APIs]
    GetDC、GetDCEx、GetWindowDC [Daily APIs]
    SHCreateMenuBar [Daily APIs]
    无法创建VC++ 智能项目的解决方法?
    CreateCompatibleBitmap [Daliy APIs]
    Windows Mobile Gesture 开发学习 持续更新
  • 原文地址:https://www.cnblogs.com/wdht/p/6119487.html
Copyright © 2011-2022 走看看