zoukankan      html  css  js  c++  java
  • Android: ListView的使用(列表控件)

    当程序中有大量的数据需要展示时,就需要用到 ListView 啦。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。

    1.基本性质

    (1)由于数组中的数据无法直接传递给ListView,我们需要借助适配器(Adapter)来完成。
    (2)Adapter有多种,需要根据ListView不同的使用情况选择不同的适配器。主要有两种ArrayAdapter / SimpleAdapter

    ListView的关键操作是制作一个符合要求的Adapter,将数据注入ListView中。

    2.ArrayAdapter / SimpleAdapter

      ArrayAdapter适配器是数组适配器,只能去适配展示很简单的格局,只能展示条目Item的一个控件。

      SimpleAdapter适配器是好用适配器,可以展示比ArrayAdapter复杂一些到格局,可以展示一个条目Item的多个控件。

    两者创建的参数有所不同:

    (1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项(item)显示的布局,data:数据源变量);

    (2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:所要注入的数据源,layout:每个列表项(item)显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);

    其中:

    data要整理为符合的形式,ArrayAdapter的data形式是数组,SimpleAdapter 的形式是ArrayList<HashMap<String, Object>>。

    SimpleAdapter最后两个参数,new String[]是指在已经建好的hashmap的键值所对应的数据取出,放入new int[]所对应的控件中。

    ArrayAdapter:

        private String[] data = {"Sunny","Cloudy","Few Clouds","Partly Cloudy","Overcast","Windy","Calm","Light Breeze"};
            //通过泛型来指定要适配的数据类型,然后在构造函数中把适配的数据传入。
            //android.R.layout.simple_list_item_1是ListView内置的一个子项布局,里面只有一个TextView,可显示一段文本
            //data表示要适配的数据
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
            ListView listView = (ListView)findViewById(R.id.list_view);
            //将构建好的适配器对象传进去
            listView.setAdapter(adapter);

    SimpleAdapter:

    private String[] detail={"“白灼”是粤菜的一种烹调技法,就是用滚水或汤将食物烫熟。 多数的北方人都对“白灼”有一种概念上的混淆,认为白灼就是用白水煮一下捞出,其实不然,那是对字面上的一个误解,真正的白灼虾还是有几道工序的,经过一个朋友的指点,才得以顿悟。 白灼虾其实是最简单的,无需过多调料,没有繁杂的过程,也不必耗费大量的时间,甚至不用考虑食用时的温度,不用过多思忖摆盘的装饰,搭配一个同样简约的酸咸小味碟,就可以上桌了。 特别是想吃虾又懒得太操劳的人,可以选择做这道菜,简单又新鲜。也是我最钟爱的一道保留菜谱。 作为一只基围虾,衣衫齐整的出场体面面完整,无疑是对它的最高奖赏,绅士而优雅地被人类享用当然是最好的结局。",
                "相传,烤鸭之美,是源于名贵品种的北京鸭,它是当今世界最优质的一种肉食鸭。据说,这一特种纯北京鸭的饲养,约起于千年前左右,是因辽金元之历代帝王游猎,偶获此纯白野鸭种,后为游猎而养,一直延续下来,才得此优良纯种,并培育成今之名贵的肉食鸭种。即用填喂方法育肥的一种白鸭,故名“填鸭”。不仅如此,北京鸭曾在百年以前传至欧美,经繁育一鸣惊人。因而,作为优质品种的北京鸭,成为世界名贵鸭种来源已久。"
        };
        private String[] title={"白灼虾","北京烤鸭"};
        private int[] imageid={R.drawable.pic1,R.drawable.pic2};
        List<HashMap<String, Object>> data;
       
      data
    =new ArrayList<HashMap<String, Object>>(); for(int i=0;i<title.length;i++){ HashMap<String,Object> showitem = new HashMap<String,Object>(); showitem.put("name",title[i]); showitem.put("says",detail[i]); showitem.put("img",imageid[i]); data.add(showitem); } //创建SimpleAdapter SimpleAdapter adapter=new SimpleAdapter(getApplicationContext(),data,R.layout.list_item,new String[]{"name","says","img"},new int[]{R.id.text1,R.id.text2,R.id.img}); lstmenu.setAdapter(adapter);

    下面是别人的代码,对每个参数有解释:

            // 使用SimpleAdapter适配器
            ListAdapter listAdapter =
                    new SimpleAdapter(this, // 上下文
                                      list,         // 数据
                                      android.R.layout.simple_list_item_2, // 使用系统的布局
                                      new String[]{"id", "name"}, // 设置Map的key,数据从哪里来
                                      new int[]{android.R.id.text1, android.R.id.text2}); // 系统布局的两个控件ID,数据设置到那里去
    
            // 把适配器给ListView
            listView.setAdapter(listAdapter);

    3.ListView为item设置监听事件(点击事件(OnItemClickListener))

    onItemClick(AdapterView<?> parent, View view, int position, long id)

      parent:官方解释为:The AdapterView where the click happened,也就是用户所点击的AdapterView,这个参数一般不用。

      view:当前点击的列表项所对应的布局View对象,可通过这个参数获得相应的列表项内部的组件,进而对其进行操作。举个例子,假设有一个ListView,含有4个列表项,你点了第2个,那么通过view你就可以操作第2个列表项里面的TextView、ImageView等等的组件(假设存在)。

      position:当前点击的列表项的位置,从0开始,也就是点击第n个,position就是n-1。

      id:当前点击的列表项的序号,也是从0开始,一般情况下position和id是一样的。

    (注意,这里四个参数都是继承的父函数。也就是不需要自己输入,原来就有。)

         lstmenu=(ListView) findViewById(R.id.lstmenu);
            lstmenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
                    //点击的Item的内容通过参数带入itemActivity,并打开
                    Intent intent = new Intent(itemdetailActivity.this,itemActivity.class);     //创建Intent
                    intent.putExtra("detail_img",imageid[position]);  //将要传递的信息放入Intent
                    intent.putExtra("detail_text1",title[position]);  //将要传递的信息放入Intent
                    intent.putExtra("detail_text2",detail[position]);  //将要传递的信息放入Intent
                    startActivity(intent);
                }
    
            });

    补充:

    在J2EE中提供过一种非常好的框架–MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上。在Android中有这样一种高级控件,他的实现过程就类似于MVC框架。之所以称它高级,是因为他的使用不像其他控件一样,拖拽到界面上就能用,而是需要通过适配器将某些样式的数据或控件添加到其上而使用,这样的控件就是我们今天要说的AdapterView。

    一:AdapterView–>V(视图)

    1:作用

    以列表的形式显示数据

    2: 内容

    AdapterView的内容一般是包含多项相同格式资源的列表

    3:特点

    (1)将前端显示和后端数据分离

    (2)内容不能通过ListView.add的形式添加列表项,需指定一个Adapter对象,通过它获得显示数据

    (3)ListView相当于MVC框架中的V(视图)

    (4)Adapter相当于MVC框架中的C(控制器)

    (5)数据源相当于MVC框架中的M(模型)

    (6)超出屏幕显示之后,自动加上滚动条

    4:分类

    (1)ListView:列表,其中只能含有一个控件TextView,

    (2)Spinner:下拉列表,给用户提供选择

    (3)Gallery:缩略图,已经被水平的ScrollView和ViewPicker取代,但也还算常用,是一个可以把子项以中心锁定,水平滚动的列表

    (4)GridView:网格图,以表格形式显示资源,可以左右滑动的

    5:事件

    (1)用户单击列表项事件

    ◆为列表加载setOnItemClieckListener监听,重写onItemClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

    (2)用户长按事件

    ◆为列表加载setOnItemLongClieckListener监听,重写onItemLongClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

    6:数据填充

    借助下面的Adapter适配器对象从数据源中进行适配

    二:Adapter–>C(控制器)

    1:作用

    把数据源中数据以某种样式(xml文件)显示在视图中。

    2:分类

    (1)ArrayAdapter:他只能处理列表项内容全是文本的情况。

    ◆数据源:数组或者List对象或者其他

    (2)SimpleAdapter: 他不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。

    ◆数据源:只能为List<Map<“键”,“值”>>形式的数据

    (3)自定义Adapter:根据xml文件中定义的样式惊醒列表项的填充,适用性最强。

    (4)SimpleCursorAdapter:专门用于把游标中的数据映像到列表中(我们以后再来研究)

    3:自定义Adapter

    (1)创建类,继承自BaseAdapter

    (2)重写其中的四个方法

    ①int getCount():返回的是数据源对象的个数,即列表项数

    ②Object getItem(int position):返回指定位置position上的列表

    ③long getItemId(int position):返回指定位置处的行ID

    ④View getView():返回列表项对应的视图,方法体中

    ◆实例化视图填充器

    ◆用视图填充器,根据Xml文件,实例化视图

    ◆根据布局找到控件,并设置属性

    ◆返回View视图

    三:数据填充

    1:声明AdapterView对象,根据ID利用findViewById方法找到此对象

    2:声明Adapter对象,根据构造方法实例化此对象。具体如下:

    (1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量);

    (2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);

    (3)自定义Adapter类 adapter = new 自定义Adapter类构造方法;

    3:绑定Adapter对象到Adapter上

    AdapterView对象.setAdapter(Adapter对象);

    参考文章:MartinDongChang

  • 相关阅读:
    java实现第二届蓝桥杯四方定理
    java实现第二届蓝桥杯四方定理
    java实现第二届蓝桥杯四方定理
    JPos学习
    Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
    java使用Thumbnailator操作图片
    Python的另一种开发环境--Anaconda中的Spyder
    Java多线程干货系列—(四)volatile关键字
    Java多线程干货系列—(二)synchronized
    Java多线程干货系列—(一)Java多线程基础
  • 原文地址:https://www.cnblogs.com/doggod/p/12110484.html
Copyright © 2011-2022 走看看