(010)ListView

ListView 作为安卓中最常用以及最难用的一个控件,确实是一件光宗耀祖的事 下面我们扒拉扒拉他的先祖们

AbsListView --> AdapterView --> ViewGrop -- >View -->Object-->ListView

接下来分析一下这个伟大的ListView
一, 特点

1, 它是一个组件

2, 它继承自ViewGrop , 所以说它是一个容器

3, 它的列表项是由Adapter提供, 通过setAdapter(adapter);

4, 它包含多个列表项, 并且以列表的方式显示

二, 属性

    android:divider = ""  Item之间的颜色  可以是图片 , 颜色(#RGB)

    android:dividerHeight = "" Item之间的间距

    android:entries = ""   属性填充

三, 填充方式

1, 属性填充

    step01: 在res/values/strings.xml中 

        <String-array anroid:name = "books">
            <item>三国演义</item>
        </String-array>

    step02: 在控件中:  <ListView  android:entries = "@array/books"/>


2, ArrayAdapter 

    适用场景: Item中只有一行文本信息, 不能显示图片

    数据源:    String[] / List<String>

    步骤:
        step1:  得到控件并且初始化

        step2:  得到数据源

        step3:  定义适配器

        step4:  为控件设置适配器



3, SimpleAdapter

    适用场景:Item可以是图文混排, 图片是本地

    数据源:  List<Map<String,Object>>

    步骤:
        step1:  得到控件并且初始化

        step2:  得到数据源

        step3:  定义适配器

        step4:  为控件设置适配器

4, BaseAdapter

    适用场景:  Item可以是图文混排, 图片可以是本地也可以是网络

    数据源:    List<模型类>   List<Map<String,Object>>

    步骤
        step1:  得到控件并且初始化

        step2:  得到数据源

        step3:  定义适配器

        step4:  为控件设置适配器

三, BaseAdapter

基本的适配器, 他是ArrayAdapter 和 SimpleAdapter 的父类

功能:  用于复杂数据的显示

用法:  

    1, 定义一个类型, 继承BaseAdapter

    2, 重写父类的4个方法
int  getCount()   返回数据源的总长度

            Object  getItem(int position)  返回当前下标对应的Item数据

            long getItemId(int position)    返回当前下标对应视图的Id

            View  getView(int position,View convertView, ViewGroup parent) 返回每个Item的视图页面

            {
                //1, 得到布局容器加载器对象
                LayoutInflater inflater = LayoutInflater.from(context);//常用
                LayoutInflater inflater = getLayoutInflater();//在Activity中使用
                LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);//得到系统服务

                //2, 加载布局

                View view = inflater.inflate(布局页面, 父容器对象parent,固定值false);

                //3, 得到布局中的控件
                TextView tv = (TextView)view.findViewById(R.id.tv);

                //4, 为控件设置内容
                tv.setText(data.get(position));

                return view;//每个Item的视图

            }

四, 事件

1, OnItemClickListener      每个条目点击事件监听器

2, OnItemLongClickListener  每个条目长按事件监听器

    返回值:  

        true  只有长按做处理

        false  自己可以处理, 其他事件也可以监听

五, ListView 的优化

android中的优化

    布局的优化:  在布局页面中减少嵌套

    java代码的优化: 用面向对象的思想, 把相同的代码封装, 相同的功能,相同的特效都封装起来

    栈内存的优化:   尽量不使用递归, 使用算法

    堆内存的优化:   少创建对象, 能重复利用的对象则重复使用


ListView中的优化

    1, 属性的优化:

        宽度和高度都设置为match_parent    getView方法只执行一次

                      wrap_content    getView方法会进入多次,来计算ListView的宽度和高度

    2, convertView的复用

        前提:  convertView的类型和新建的view 的类型是相同, 所以可以重用

        优点:  减少创建对象的数量, 节省了资源, 降低内存的消耗, 提高性能

    3, ViewHolder的使用

        将控件的获取封装, 达到重用, 减少findViewById 的次数

六, ListView 的分页加载数据

滚动事件监听器

    //滚动事件监听器
    lv.setOnScrollListener(new OnScrollListener() {

        /**
         * 监听ListView 滚动状态改变的方法
         * 
         * AbsListView view    当前ListView
         * int scrollState   滚动的状态
         * 
         * 一共有三种状态:
         * SCROLL_STATE_TOUCH_SCROLL   1    ListView正在滚动, 并且手指依然在屏幕上   
         * SCROLL_STATE_FLING          2          惯性滑动
         * SCROLL_STATE_IDLE           0     listView停止滚动
         * 
         */
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub

                Log.i("info", "scrollState === " + scrollState);

                // 1, 到达底部   2,停止滑动  ---  加载更多数据
            }

            /**
             * 监听ListView 的滚动方法
             * 
             * AbsListView view         当前的ListView
             * int firstVisibleItem     当前屏幕最上方显示的Item的下标
             * int visibleItemCount     当前屏幕显示的Item的数量(半个也算一个)
             * int totalItemCount       所有Item的数量
             */
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                // TODO Auto-generated method stub

                boolean isLast = (firstVisibleItem +visibleItemCount == totalItemCount);

                Log.i("info", "isLast --- " + isLast);
            }
        });

七, 多布局ListView

1, 添加头部视图 和 底部视图


    头部视图

        添加 lv.addHeaderView(View v)  
        移除 lv.removeHeaderView(View v)


    底部视图

        添加  lv.addFooterView(View v)

        移除  lv.removeFooterView(View v)


2, 多布局(图灵机器人)

    http://www.tuling123.com/openapi/api?key=be12dd3c0bac3654e78aa69e4b36a6dd&info=

    适配器中:

        int getViewTypeCount()   指定ListView中有几种布局

        int getItemViewType()     返回当前要加载的是那种类型的视图


        在getView() 方法中:

            if(getItemViewType(position) == 1)
            {

            }else{

            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值