• android学习日记03--常用控件ListView


    常用控件

    8、ListView
      列表视图,比如游戏的排行榜。列表数据可以根据屏幕大小自适应

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

    a、ListVeiw:用来展示列表的View。

    b、适配器:用来把数据映射到ListView上的中介。

    c、数据:具体的将被映射的字符串,图片,或者基本组件。


    ListView用到两种适配器:
    1、ArrayAdapter--简单适配器,只显示文字

    2、SimpleAdapter--自定义适配器,可以显示自定义内容

    3、SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来,暂时不讲。

    使用简单适配器可直接
    new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
    this:当前context
    android.R.layout.simple_list_item_1是系统的布局文件
    list:ListView的各项数据

    SimpleAdapter各项参数
    new SimpleAdapter(context, data, resource, from, to)
    context:当前context内容
    data:ListView的各项数据
    resource:ListView的每项布局
    from:ListView的组件索引
    to:ListView的组件ID
    如:
    new SimpleAdapter(MainActivity.this, list, R.layout.activity_main, new String[] {"item1","item2","item3","item4","item5"}
    , new int[] {R.id.iv,R.id.bigtv,R.id.smalltv,R.id.btn,R.id.cb});

    但是SimpleAdapter 不能触发组件的事件,还需
    自己写适配器继承BaseAdapter

    BaseAdapter主要有四个方法
    getCount --列表每一项的长度
    getItem
    getItemId
    getView --绘制每一项的具体组件

    例子演示自定义MyAdapter

     1 <?xml version="1.0" encoding="utf-8"?>  
     2 <LinearLayout   
     3     android:orientation="horizontal" 
     4     android:layout_width="fill_parent"   
     5     android:layout_height="fill_parent"   
     6     xmlns:android="http://schemas.android.com/apk/res/android"
     7     >  
     8     <ImageView 
     9         android:id="@+id/iv"   
    10         android:layout_width="wrap_content"   
    11         android:layout_height="wrap_content"   
    12         />
    13     <LinearLayout   
    14         android:orientation="vertical" 
    15         android:layout_width="wrap_content"   
    16         android:layout_height="wrap_content"   
    17     >  
    18     <TextView 
    19         android:layout_width="wrap_content"   
    20         android:layout_height="wrap_content"  
    21         android:textSize="20sp"
    22         android:id="@+id/bigtv"
    23         />
    24     
    25     <TextView 
    26         android:layout_width="wrap_content"   
    27         android:layout_height="wrap_content"  
    28         android:textSize="10sp"
    29         android:id="@+id/smalltv"
    30         />
    31     
    32     </LinearLayout>
    33     
    34     <Button 
    35         android:layout_width="wrap_content"   
    36         android:layout_height="wrap_content" 
    37         android:text="button"
    38         android:id="@+id/btn"
    39         android:focusable="false"
    40         />
    41     
    42     <CheckBox 
    43         android:layout_width="wrap_content"   
    44         android:layout_height="wrap_content" 
    45         android:id="@+id/cb"
    46         android:focusable="false"
    47         />
    48         
    49     
    50 </LinearLayout>
    View Code

    布局文件要特别说明两个属性
    android:textSize="10sp" 设置text的大小
    android:focusable="false" 设置焦点属性不可见

      1 package com.example.listview2;
      2 
      3 import java.util.List;
      4 import java.util.Map;
      5 
      6 import android.app.AlertDialog;
      7 import android.content.Context;
      8 import android.view.LayoutInflater;
      9 import android.view.View;
     10 import android.view.View.OnClickListener;
     11 import android.view.ViewGroup;
     12 import android.widget.BaseAdapter;
     13 import android.widget.Button;
     14 import android.widget.CheckBox;
     15 import android.widget.CompoundButton;
     16 import android.widget.CompoundButton.OnCheckedChangeListener;
     17 import android.widget.ImageView;
     18 import android.widget.TextView;
     19 
     20 public class MyAdapter extends BaseAdapter {
     21 
     22     
     23     private LayoutInflater mInflater;
     24     private List<Map<String, Object>> list;
     25     private int layId;
     26     private String flag[];
     27     private int itemId[];
     28     
     29     
     30     
     31     public MyAdapter(Context context, List<Map<String, Object>> list,
     32             int layId, String[] flag, int itemId[]) {
     33         this.mInflater = LayoutInflater.from(context);
     34         this.list = list;
     35         this.layId = layId;
     36         this.flag = flag;
     37         this.itemId = itemId;
     38     }
     39 
     40     @Override
     41     public int getCount() {
     42         // TODO Auto-generated method stub
     43         return list.size();
     44     }
     45 
     46     @Override
     47     public Object getItem(int arg0) {
     48         // TODO Auto-generated method stub
     49         return null;
     50     }
     51 
     52     @Override
     53     public long getItemId(int arg0) {
     54         // TODO Auto-generated method stub
     55         return 0;
     56     }
     57 
     58     @Override
     59     public View getView(int arg0, View arg1, ViewGroup arg2) {
     60         // TODO Auto-generated method stub
     61         arg1 = mInflater.inflate(layId, null);
     62         for (int i = 0; i < flag.length; i++) {
     63             if (arg1.findViewById(itemId[i]) instanceof ImageView) {
     64                 ImageView iv = (ImageView)arg1.findViewById(itemId[i]);
     65                 iv.setBackgroundResource((Integer) list.get(arg0).get(flag[i]));
     66             }else if (arg1.findViewById(itemId[i]) instanceof TextView) {
     67                 TextView tv = (TextView)arg1.findViewById(itemId[i]);
     68                 tv.setText((String)list.get(arg0).get(flag[i]));
     69             }
     70         }
     71         
     72         ((Button) arg1.findViewById(R.id.btn))
     73             .setOnClickListener(new OnClickListener() {
     74             
     75             @Override
     76             public void onClick(View v) {
     77                 // TODO Auto-generated method stub
     78                 new AlertDialog.Builder(MainActivity.ma)
     79                 .setTitle("自定义SimpleAdapter")
     80                 .setMessage("按钮成功触发监听事件!")
     81                 .show();
     82             }
     83         });
     84         CheckBox cb = (CheckBox) arg1.findViewById(R.id.cb);
     85         
     86         cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
     87             
     88             @Override
     89             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     90                 // TODO Auto-generated method stub
     91                 new AlertDialog.Builder(MainActivity.ma)
     92                 .setTitle("自定义 adapter")
     93                 .setMessage("触发选择框")
     94                 .show();
     95             }
     96         });
     97         
     98         return arg1;
     99     }
    100 
    101 }
    View Code

    MyAdapter代码里
    new AlertDialog.Builder(MainActivity.ma)
    .setTitle("自定义 adapter")
    .setMessage("触发选择框")
    .show();

    表示弹出对话框,与Toast不同的是 该对话框要按返回才会退出,而Toast是一闪而过的,对话框在下一讲详细阐述
    MainActivity.ma是定义在MainActivity的静态变量指向this自己

    MainActivity代码

     1 package com.example.listview2;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashMap;
     5 import java.util.List;
     6 import java.util.Map;
     7 
     8 import android.app.Activity;
     9 import android.os.Bundle;
    10 import android.view.Menu;
    11 import android.widget.ListView;
    12 import android.widget.SimpleAdapter;
    13 
    14 public class MainActivity extends Activity {
    15     private ListView lv;
    16     private List<Map<String, Object>> list;
    17     //private SimpleAdapter sp;
    18     public static MainActivity ma;
    19     @Override
    20     protected void onCreate(Bundle savedInstanceState) {
    21         super.onCreate(savedInstanceState);
    22         setContentView(R.layout.activity_main);
    23         
    24         ma = this;
    25         
    26         lv = new ListView(this);
    27         
    28         list = new ArrayList<Map<String,Object>>();
    29         
    30         Map<String, Object> map = new HashMap<String, Object>();
    31         map.put("item1", R.drawable.ic_launcher);
    32         map.put("item2", "bigtv");
    33         map.put("item3", "smalltv");
    34         
    35         list.add(map);
    36         
    37         
    38         //sp = new SimpleAdapter(MainActivity.this, list, R.layout.activity_main, new String[] {"item1","item2","item3","item4","item5"}, new int[] {R.id.iv,R.id.bigtv,R.id.smalltv,R.id.btn,R.id.cb});
    39         //lv.setAdapter(sp);
    40         
    41            // --使用自定义适配器,可监听其ListView中每一项的事件监听
    42         MyAdapter adapter = new MyAdapter(this, list, R.layout.activity_main, new String[] {"item1","item2","item3"}, new int[] {R.id.iv,R.id.bigtv,R.id.smalltv});
    43              // 为列表视图设置适配器(将数据映射到列表视图中)
    44             lv.setAdapter(adapter);
    45              // //显示列表视图
    46         
    47         this.setContentView(lv);
    48         
    49     }
    50 
    51 
    52     @Override
    53     public boolean onCreateOptionsMenu(Menu menu) {
    54         // Inflate the menu; this adds items to the action bar if it is present.
    55         getMenuInflater().inflate(R.menu.main, menu);
    56         return true;
    57     }
    58     
    59 }
    View Code

    运行效果

     

    ========个人网站:http://chendd.com/ 文章很多是上面搬过来的,以后都在个人网站上更新,有兴趣的可以移步☺========
  • 相关阅读:
    出现System.web.mvc冲突的原因及解决方法CS0433
    看完此文还不懂NB-IoT,你就过来掐死我吧...
    html5调用手机陀螺仪实现方向辨识
    黑盒测试和白盒测试的区别
    CentOS7 下 keepalived 的安装和配置
    centos 下 mysql+keepalived实现双主自由切换
    MySQL 高可用性—keepalived+mysql双主(有详细步骤和全部配置项解释)
    备份VMware虚拟磁盘文件 移植到其他虚拟机
    Centos7 Mysql 双机热备实现数据库高可用
    CentOS7配置Mysql热备份
  • 原文地址:https://www.cnblogs.com/aiguozhe/p/3550424.html
Copyright © 2020-2023  润新知