zoukankan      html  css  js  c++  java
  • Android菜鸟成长记10 ListVew

       ListView在我们学习Android的过程中是非常重要得一个部分。

      listview主要有两个职责

      1)将数据填充到布局。

      2)处理用户的选择点击等操作。

      

      一个ListView的创建需要3个元素。

      (1)ListView中的每一列的View。

      (2)填入View的数据或者图片等。

    那么我们直接通过案例来加深对listviewde理解

    首先,我们创建一个listview布局

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6 
     7     <ListView
     8         android:id="@+id/listView1"
     9         android:layout_width="match_parent"
    10         android:layout_height="match_parent" >
    11         
    12     </ListView>
    13 
    14 </LinearLayout>

    接着我们来为这个listview添加的item设置显示样式

      

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="horizontal" >
     6 
     7     <ImageView
     8         android:id="@+id/imageView1"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:layout_margin="10dp"
    12         android:src="@drawable/tou1" />
    13 
    14     <LinearLayout
    15         android:layout_weight="1"
    16         android:layout_width="match_parent"
    17         android:layout_height="80dp"
    18         android:orientation="vertical" 
    19         android:layout_margin="5dp"
    20         >
    21         <TextView
    22        
    23         android:id="@+id/tv_userName"
    24          android:layout_width="match_parent"
    25         android:layout_height="20dp"
    26          />
    27         
    28          <TextView
    29         android:id="@+id/tv_lastMessage"
    30          android:layout_width="match_parent"
    31         android:layout_height="15dp"
    32          />
    33         
    34     </LinearLayout>
    35     
    36     <TextView
    37         android:id="@+id/tv_datetime"
    38          android:layout_width="150dp"
    39         android:layout_height="15dp"
    40          />
    41 </LinearLayout>

    然后我们为了模拟数据库插入,先创建一个实体类

      

     1 package com.example.entity;
     2 
     3 public class Message {
     4     private String tou1;
     5     private String userName;
     6     private String lastMessage;
     7     private String datetime;
     8     
     9     public String getTou1() {
    10         return tou1;
    11     }
    12     public void setTou1(String tou1) {
    13         this.tou1 = tou1;
    14     }
    15     public String getUserName() {
    16         return userName;
    17     }
    18     public void setUserName(String userName) {
    19         this.userName = userName;
    20     }
    21     public String getLastMessage() {
    22         return lastMessage;
    23     }
    24     public void setLastMessage(String lastMessage) {
    25         this.lastMessage = lastMessage;
    26     }
    27     public String getDatetime() {
    28         return datetime;
    29     }
    30     public void setDatetime(String datetime) {
    31         this.datetime = datetime;
    32     }
    33 }

    剩下的就是对listview进行数据的获取

      

      1 package com.example.winxin2;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import com.example.entity.Message;
      7 
      8 import android.app.Activity;
      9 import android.os.Bundle;
     10 import android.util.Log;
     11 import android.view.ContextMenu;
     12 import android.view.ContextMenu.ContextMenuInfo;
     13 import android.view.LayoutInflater;
     14 import android.view.Menu;
     15 import android.view.MenuItem;
     16 import android.view.View;
     17 import android.view.View.OnCreateContextMenuListener;
     18 import android.view.ViewGroup;
     19 import android.widget.AdapterView;
     20 import android.widget.AdapterView.OnItemClickListener;
     21 import android.widget.BaseAdapter;
     22 import android.widget.ListView;
     23 import android.widget.TextView;
     24 import android.widget.Toast;
     25 
     26 
     27 public class MainActivity extends Activity {
     28 
     29     private ListView lv;
     30     private List<Message> messageList = new ArrayList<Message>();
     31     
     32     @Override
     33     protected void onCreate(Bundle savedInstanceState) {
     34         super.onCreate(savedInstanceState);
     35         setContentView(R.layout.weixin);
     36         
     37         //模拟读取数据库或者互联网
     38         for (int i = 0; i < 100; i++) {
     39             Message m = new Message();
     40             m.setTou1("xxx");
     41             m.setUserName("张三疯"+i);
     42             m.setLastMessage("今晚有约,一起华山论剑");
     43             m.setDatetime("11月11日");
     44             messageList.add(m);
     45         }
     46         
     47         
     48         lv = (ListView)findViewById(R.id.listView1);
     49         //简单理解为VC绑在一起
     50         lv.setAdapter( new BaseAdapter(){
     51 
     52             //返回多少条记录
     53             @Override
     54             public int getCount() {
     55                 // TODO Auto-generated method stub
     56                 return messageList.size();
     57             }
     58             //每一个item项,返回一次界面
     59             @Override
     60             public View getView(int position, View convertView, ViewGroup parent) {
     61                 View view = null;
     62                 
     63                 //下面的半段是为了让我们在拉伸的时候更顺畅,即之前取出的数据我们可以在缓存在获取,不需要在重新获取一次
     64                 //布局不变,数据变
     65                 
     66                 //如果缓存为空,我们生成新的布局作为1个item
     67                 if(convertView==null){
     68                     Log.i("info:", "没有缓存,重新生成"+position);
     69                     LayoutInflater inflater = MainActivity.this.getLayoutInflater();
     70                     //因为getView()返回的对象,adapter会自动赋给ListView
     71                     view = inflater.inflate(R.layout.listview_item_layout, null);
     72                 }else{
     73                     Log.i("info:", "有缓存,不需要重新生成"+position);
     74                     view = convertView;
     75                 }
     76                 Message m = messageList.get(position);
     77                 
     78                 TextView tv_userName = (TextView)view.findViewById(R.id.tv_userName);
     79                 tv_userName.setText(  m.getUserName()  );
     80                 tv_userName.setTextSize(15);
     81                 
     82                 TextView tv_lastMessage = (TextView)view.findViewById(R.id.tv_lastMessage);
     83                 tv_lastMessage.setText(  m.getLastMessage()  );
     84                 tv_lastMessage.setTextSize(12);
     85                 
     86                 TextView tv_datetime = (TextView)view.findViewById(R.id.tv_datetime);
     87                 tv_datetime.setText( m.getDatetime()  );
     88                 tv_datetime.setTextSize(12);
     89 
     90                 return view;
     91             }
     92             
     93             @Override
     94             public Object getItem(int position) {
     95                 // TODO Auto-generated method stub
     96                 return null;
     97             }
     98 
     99             @Override
    100             public long getItemId(int position) {
    101                 // TODO Auto-generated method stub
    102                 return 0;
    103             }
    104 
    105             
    106             
    107         } );
    108         
    109         //给ListView添加点击事件
    110         lv.setOnItemClickListener(new OnItemClickListener() {
    111 
    112             @Override
    113             public void onItemClick(AdapterView<?> parent, View view,
    114                     int position, long id) {
    115                 Message getList = messageList.get(position); 
    116                 String infoId = getList.getTou1(); //获取信息id  
    117                 String infoTitle = getList.getUserName();    //获取信息标题  
    118                 String infoDetails = getList.getLastMessage();    //获取信息详情  
    119                   
    120                 //Toast显示测试  
    121                 Toast.makeText(MainActivity.this, "信息ID:"+infoId,Toast.LENGTH_SHORT).show(); 
    122             }
    123             
    124         });
    125         
    126         //长按菜单显示  
    127         lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {  
    128             public void onCreateContextMenu(ContextMenu conMenu, View view , ContextMenuInfo info) {  
    129                 /*
    130                  * 参数menu:参数menu为事件的上下文菜单。
    131 
    132                     参数v:参数v为事件源View,当该View获得焦点时才可能接收该方法的事件响应。
    133 
    134                     参数info:info对象中封装了有关上下文菜单额外的信息,这些信息取决于事件源View。
    135                  */
    136                 conMenu.setHeaderTitle("菜单");  
    137                 conMenu.add(0, 0, 0, "条目一");  
    138                 conMenu.add(0, 1, 1, "条目二");  
    139                 conMenu.add(0, 2, 2, "条目三");  
    140             }  
    141         }); 
    142      
    143           
    144     }    
    145     
    146     //长按菜单处理函数  
    147     public boolean onContextItemSelected(MenuItem aItem) {  
    148         AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)aItem.getMenuInfo();  
    149         switch (aItem.getItemId()) {  
    150              case 0:  
    151                  Toast.makeText(MainActivity.this, "你点击了条目一",Toast.LENGTH_SHORT).show();  
    152                  return true;  
    153              case 1:  
    154                  Toast.makeText(MainActivity.this, "你点击了条目二",Toast.LENGTH_SHORT).show();  
    155                
    156                  return true;  
    157              case 2:  
    158                  Toast.makeText(MainActivity.this, "你点击了条目三",Toast.LENGTH_SHORT).show();  
    159                  return true;  
    160         }  
    161         return false;  
    162    }  
    163 }

    本人比较赖,直接将写好的代码放上来了,里面的基本做好了注释

    那么,我们来看一下结果吧

     上面第是点击和长按的点击效果。

  • 相关阅读:
    【机器学习】机器学习12个关键经验教训
    【机器学习】24个终极项目提升您的机器学习知识和技能
    2018-12-21-WPF-弹出-popup-里面的-TextBox-无法输入汉字
    2019-10-31-C#-dotnet-获取整个局域网的-ip-地址
    2018-11-26-win10-uwp-获取窗口的坐标和宽度高度
    2019-5-21-dotnet-core-使用-CoreRT-将程序编译为-Native-程序
    2019-5-21-Roslyn-使用-Directory.Build.props-管理多个项目配置
    2019-2-26-SublimeText-快速打开当前文件的文件夹
    2019-2-18-VisualStudio-给项目添加特殊的-Nuget-的链接
    2019-8-31-dotnet-如何在-Mock-模拟-Func-判断调用次数
  • 原文地址:https://www.cnblogs.com/lsyverygood/p/6101559.html
Copyright © 2011-2022 走看看