zoukankan      html  css  js  c++  java
  • Android Listview & Adapter

    Listview主要有两个职责:

    • 将数据填充到布局  
    • 处理用户的选择点击等操作

    列表的显示需要三个元素:

    • ListVeiw 用来展示列表的View
    • 适配器(Adapter) 用来把数据映射到ListView上的中介
    • 数据(data)    具体的将被映射的字符串,图片,或者基本组件

    首先要了解什么是适配器:  

      适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。

    Android中提供了很多的Adapter,常用的有4种:

    • ArrayAdapter<T>    ---->用来绑定一个数组,支持泛型操作
    • SimpleAdapter        ---->用来绑定在xml中定义的控件对应的数据
    • SimpleCursorAdapter -->用来绑定游标得到的数据
    • BaseAdapter           ---->通用的基础适配器

    今天我们就来学习一下ListView & BaseAdapter

    1.Layout.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="vertical" >
      
          <ListView
              android:id="@+id/listView1"
              android:layout_width="match_parent"
              android:layout_height="match_parent" >
             
         </ListView>
     
     </LinearLayout>

    2.为Listview添加的item设置显示样式

    <?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/tou1" />
     
          <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"
             />
     </LinearLayout>

    3.模拟数据库插入,先创建一个实体类

     package com.example.entity;
     
     public class Message {
          private String tou1;
          private String userName;
          private String lastMessage;
          private String datetime;
          
          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;
         }
     }

    4.对listview进行数据的获取

    package com.example.winxin2;
      
      import java.util.ArrayList;
      import java.util.List;
       
      import com.example.entity.Message;
       
      import android.app.Activity;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.ContextMenu;
      import android.view.ContextMenu.ContextMenuInfo;
      import android.view.LayoutInflater;
      import android.view.Menu;
      import android.view.MenuItem;
      import android.view.View;
      import android.view.View.OnCreateContextMenuListener;
      import android.view.ViewGroup;
      import android.widget.AdapterView;
      import android.widget.AdapterView.OnItemClickListener;
      import android.widget.BaseAdapter;
      import android.widget.ListView;
      import android.widget.TextView;
      import android.widget.Toast;
      
      
      public class MainActivity extends Activity {
      
          private ListView lv;
          private List<Message> messageList = new ArrayList<Message>();
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.weixin);
              
              //模拟读取数据库或者互联网
              for (int i = 0; i < 100; i++) {
                  Message m = new Message();
                  m.setTou1("xxx");
                  m.setUserName("张三疯"+i);
                  m.setLastMessage("今晚有约,一起华山论剑");
                  m.setDatetime("11月11日");
                  messageList.add(m);
              }
              
              
              lv = (ListView)findViewById(R.id.listView1);
              //简单理解为VC绑在一起
              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;
                      }
                      Message 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;
                 }
     
                 
                 
             } );
             
             //给ListView添加点击事件
             lv.setOnItemClickListener(new OnItemClickListener() {
     
                 @Override
                 public void onItemClick(AdapterView<?> parent, View view,
                         int position, long id) {
                     Message getList = messageList.get(position); 
                     String infoId = getList.getTou1(); //获取信息id  
                     String infoTitle = getList.getUserName();    //获取信息标题  
                     String infoDetails = getList.getLastMessage();    //获取信息详情  
                       
                     //Toast显示测试  
                     Toast.makeText(MainActivity.this, "信息ID:"+infoId,Toast.LENGTH_SHORT).show(); 
                 }
                 
             });
             
             //长按菜单显示  
             lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {  
                 public void onCreateContextMenu(ContextMenu conMenu, View view , ContextMenuInfo info) {  
                     /*
                      * 参数menu:参数menu为事件的上下文菜单。
     
                         参数v:参数v为事件源View,当该View获得焦点时才可能接收该方法的事件响应。
     
                         参数info:info对象中封装了有关上下文菜单额外的信息,这些信息取决于事件源View。
                      */
                     conMenu.setHeaderTitle("菜单");  
                     conMenu.add(0, 0, 0, "条目一");  
                     conMenu.add(0, 1, 1, "条目二");  
                     conMenu.add(0, 2, 2, "条目三");  
                 }  
             }); 
          
             }    
        
         //长按菜单处理函数  
         public boolean onContextItemSelected(MenuItem aItem) {  
             AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)aItem.getMenuInfo();  
             switch (aItem.getItemId()) {  
                  case 0:  
                      Toast.makeText(MainActivity.this, "你点击了条目一",Toast.LENGTH_SHORT).show();  
                      return true;  
                  case 1:  
                      Toast.makeText(MainActivity.this, "你点击了条目二",Toast.LENGTH_SHORT).show();  
                    
                      return true;  
                  case 2:  
                      Toast.makeText(MainActivity.this, "你点击了条目三",Toast.LENGTH_SHORT).show();  
                      return true;  
             }  
             return false;  
        }  
     }

    谢谢大家的关注。欲向海天寻月去,五更飞梦渡鲲洋

  • 相关阅读:
    URI、URL、URN区别
    http历史
    http基础
    那些年我踩过的electron+react的坑!!!
    【Error】System limit for number of file watchers reached
    zsh: corrupt history file /home/floodlight/.zsh_history
    electron中持久化保存数据的解决方案electron-store
    坑:pytest 运行报错unknown hook 'pytest_namespace' in plugin <module 'allure.pytest_plugin'
    坑:找到LoadRunner中Recording Options和 Run Time Settings配置选项确实的原因
    Loadrunner基本概念解析<一>
  • 原文地址:https://www.cnblogs.com/hxb2016/p/6106361.html
Copyright © 2011-2022 走看看