当前位置: 代码迷 >> Android >> android中与Adapter相关的控件-ListView
  详细解决方案

android中与Adapter相关的控件-ListView

热度:607   发布时间:2016-04-24 11:54:22.0
android中与Adapter相关的控件----ListView

ListView讲解:

一、ListView这个控件是一个使用非常广泛的控件,值得深入的学习和研究。基本使用已经在Adapter中使用过了

二、常用的属性和方法

footerDividersEnabled:是否在footerView(表尾)前绘制一条分割线,默认是true

headerDividersEnabled:是否在headerView(表头)后绘制一条分割线,默认是true

divider:设置分割条,可以是颜色分割,也可以用drawable资源分割

dividerHeight:设置分隔条的高度

stackFromBottom:列表从底部开始显示,设置为true即可,好像没什么用。

cacheColorHint:如果你为ListView设置了一个图片作为Background的时候,当你拖动或者点击listView空白位置会发现item变成了变成黑色了,这是时候我们通过这个擦车ColorHint将颜色设置为透明:#000000

 scrollbars ="none"或者setVerticalBarEnabled(true)隐藏滑动条

添加listView的表头或者表尾貌似只能在Java中操作

addHeaderView(View view):添加HeaderView(表头),括号里面是一个View对象,可以通过context上下文对象获得。

addFooterView(View view):添加foot二View(表尾),括号里面是一个view对象,同样也是可以通过context上下文对象获得。

addHeaderView(headerView,null,false):和上面的区别:设置Header是否可以被选中

addFooterView(footerView,null,false):和上面的区别;设置footer是否可以被选中

三、listView的焦点问题

如果向item中添加button,checkBox等等控件的时候,这时我们就需要考虑焦点的问题

当写一个简单的listView,上面如果含有Button,checkBox的时候,点击item不起作用,也就是不能触发onItemClick事件,也就是说listView的焦点被其它控件抢占了。

解决的办法:

方法1、为抢占控件设置android:focusable =  "false"

方法2、item根节点设置android:descendantFocusability = "blocksDescendants",属性值有三种选择

beforeDescendants:这个值表示ViewGroup会优先其子类控件而获取焦点

afterDescendants:这个值表示ViewGroup会当子类的控件不需要获取焦点的时候才获取焦点

blocksDescendants:这个值表示ViewGroup会覆盖子类控件而直接获得焦点

四、listView关于CheckBox的选择错位问题。

方法一、可以放到一个HashMap<Integer, Boolean>中, 每次初始化的时候根据postion取出对应的boolean值,然后再进行checkbox的状态设置;也就是

HashMap<Integer, Boolean> state = new HashMap<Integer,Boolean>();

                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                                // TODO Auto-generated method stub
                                if(isChecked)
                                { 
                                       state.put(position, isChecked);
                                }else{
                                     state.remove(position);
                                }
                        }

在getView()方法里面: holder.cbox.setChecked(state.get(position)==null? false : true);

方法二、在entity类中加入了一个boolean值用于判断

五、listView的数据更新(增删改查)

以增加为例调用notifyDataSetChanged()方法

step1:在我们自定义的BaseAdapter中添加一个更新数据的方法:

step2:在activity中设置按钮的监听事件,来增加一条数据

对于更新数据每次调用notifyDataSetChanged(),这个方法实际上会把界面的item都重新绘制一遍,这样会影响UI的性能,如果数据量很大的时候,只要改变其中的一项就要重新绘制所有的额item,显然是不划算的,这时我们自定义下面的方法

2楼KillU
一个listview中同时有 checkbox和BUtton可以吗?
1楼KillU
index-visibleFirstPosition,这个没看明白
Re: 会飞的一只狼
@KillU,你要修改的item的是否在可见的范围里面
  相关解决方案