Android基础控件 - ListView

本文深入探讨了ListView的适配器、表头表尾、分割线、焦点冲突及多布局等高级用法,提供了优化策略和解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 适配器

开发中大量使用BaseAdapter作为适配器



二. 表头、表尾以及分割线

footerDividersEnabled:是否在表尾设置一条分割线,默认为true

        heaerDividersEnabled:是否在表设置一条分割线,默认为true

divider:设置分割条,可用用颜色分割,也可以用图片分割

dividerHeight:设置分割条宽度

stackFromBottom:列表从底部开始显示

scrollBar:滑动条是否隐藏

cashColorHint:ListView设置背景拖动时,item背景变黑。此时可用将该值设为#00000000解决


三.  java代码加入表头尾

addHeaderView(View v)

addFooterView(View v)

addHeaderView(v, null, false) 设置header能否被选中

addFooterView(v, null, false) 设置footer能否被选中

这些方法必须在setAdapter之前执行


四. BaseAdapter优化

(1) 复用convertView

(2) ViewHolder

(3) 当多个地方使用这个ViewHolder时,可将其设为static, 这样类只需加载一次


五. ListView的焦点冲突问题

当item中有checkbox, eidttext等控件时会发生焦点冲突,这些控件会抢占item的焦点。导致item无法点击

解决方法:

① 方法一:将抢占焦点的控件的focusable设置为false

② 方法二:在item根节点设置descendantFocusability = blocksDescendants 表示ViewGroup会覆盖字控件直接获得焦点

还有两个属性beforeDescendant表示viewgroup会优先子类获得焦点;afterDescendant表示子控件不需要焦点时获得焦点



六. ListView的item中有checkbox时的错误问题

当checkbox的数量足以滚出屏幕时,由于convertView的原因,会出现isChecked错位

解决方法:可用使用HashMap<Integer, boolean>存储ischecked状态



七. List的数据为空时

(1) 可用关联一个布局,然后调用setEmptyView(View)

(2) 动态创建布局

  1. TextView emptyView = new TextView(context);  
  2. emptyView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
  3. emptyView.setText(“This appears when the list is empty”);  
  4. emptyView.setGravity(Gravity.CENTER);  
  5. emptyView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);  
  6. emptyView.setVisibility(View.GONE);  
  7. ((ViewGroup)listView.getParent()).addView(emptyView);  
  8. listView.setEmptyView(emptyView); 

(3) 不能直接这样创建

  1. TextView emptyView = new TextView(context);  
  2. emptyView.setText(“This appears when the list is empty”);  
  3. listView.setEmptyView(emptyView); 


八. ListView的重绘

notifyDataSetChange():当某个item改变时,会重绘ListView,但是没有改变的item是不会重绘的



九. ListView的多布局

(1) getItemViewType() 该item对应view的那个type

(2) getViewTypeCount() 多布局的数量,从0开始

(3) ViewHolder与Item绑定时由于类是静态的只加载一次,所以需要用id区分不同布局的id

                  convertView.setTag(R.id.Type1,holder1);

		  holder1 = (ViewHolder1) convertView.getTag(R.id.Type1);
这个id必须是recouce下的唯一id.可用在values下定义一个ids文件,生成唯一id


<item name="Type1" type="id"></item>
<item name="Type2" type="id"></item>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值