ListView中getChildAt()方法以及BaseAdapter中getview使用
来源:互联网 发布:h5 js 跳转到原生界面 编辑:程序博客网 时间:2024/06/05 06:29
一、概述
在项目开发过程中,需要动态更新标题栏上下拉框中listview的每个item,要求是有未读信息时,添加一个红点标识。 这里主要使用CircleBadgeView这个控件,主要是想在不改变listview中item布局的情况下实现给每个item右边添加红点的效果。
二,动态更新红点标识的实现方式变迁
1、方法一:
刚开始希望通过遍历listview给需要添加红点的item绑定添加一个CircleBadgeView,然后在点击标题栏 显示下拉选择框的时候就能看到已经有红点的效果。但是。。。遇到了几个比较坑的问题:
a)listview.getChildAt(index); 这个方法获取的是已经显示在窗口的item项。而在后台获取到需要更新红点状态的时候 我的标题栏下拉框还未显示(需要在点击标题的时候才会展示),所以这种情况下这个方法不能用来遍历listview进而达到给每个item做操作的预想。
另:listview.getChildCount() 获取的是已经显示在窗口的item数量,listview.getCount() 获取的是listview的item的数量。
2、方法二:
之后希望通过BaseAdapter的getview方法把所有的item封装到一个List对象里面。然后遍历这个List:
然而。。。我忽略了一点 就是BaseAdapter的getview方法只有在窗口要展示item的时候的时候才会调用。那也就说明只有在这个listview的所有item都显示出来以后 我们才能得到所有的item信息。而我们刚进这个界面的时候 下拉选择项是不显示的,所以也就不能通过这种方法事先给指定item添加红点然后等下拉框显示的时候展示出来。
3、方法三:
通过上面两种思路的尝试,说明要在达到预期效果就只能在BaseAdapter的getview方法中做工作。所以就开始尝试着每次调用getview方法的时候去判断该item是否需要加红点:
Holder:
这里用holder把badge和textview绑定,一是避免每次都重新绘制badge占用内存资源,二是方便取消对应红点。
class Holder{ private CircleBadgeView badge; private TextView textview; public TextView getTextview() { return textview; } public void setTextview(TextView textview) { this.textview = textview; } public CircleBadgeView getBadge() { return badge; } public void setBadge(CircleBadgeView badge) { this.badge = badge; }}
BaseAdapter的getview方法:
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final Holder holder; if(convertView == null){ LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = li.inflate(R.layout.popup_menu_item, parent, false); holder = new Holder(); holder.textview = (TextView) convertView.findViewById(R.id.text1); //默认为textview添加一个红点 addRedPoint(holder); convertView.setTag(holder); }else{ holder = (Holder) convertView.getTag(); } String item = getItem(position); holder.textview.setText(item); MenuItem mitem = menuItems.get(position); updateRedPoint(holder, mitem); return convertView;}
初始化
private void addRedPoint(Holder holder){ TextView tv = holder.textview; CircleBadgeView badge = null; if(badge ==null){ badge = new CircleBadgeView(context, tv); badge.setTypeface(Typeface.DEFAULT); badge.setBadgePosition(BadgeView.POSITION_TOP_RIGHT); badge.setBadgeMargin(28); badge.setBackgroundColor(Color.RED); badge.setTextSize(5); } badge.hide(); holder.badge = badge; }private void updateRedPoint(Holder holder, MenuItem mitem){ boolean isUpdate = false; switch (mitem.getItemId()) { case R.id.menu_officedoc_1: if(OfficedocManager.isAddPointType1()){ isUpdate = true; } break; case R.id.menu_officedoc_2: if(OfficedocManager.isAddPointType2()){ isUpdate = true; } break; case R.id.menu_officedoc_3: if(OfficedocManager.isAddPointType3()){ isUpdate = true; } break; case R.id.menu_officedoc_4: if(OfficedocManager.isAddPointType4()){ isUpdate = true; } break; default: break; } //判断是否需要显示红点 if(isUpdate){ if(holder.badge != null) holder.badge.show(); }else{ if(holder.badge != null) holder.badge.hide(); }}
- ListView中getChildAt()方法以及BaseAdapter中getview使用
- ListView的BaseAdapter中getView方法模板代码
- 关于ListView的BaseAdapter中getView方法问题
- BaseAdapter中getView()方法详解
- Listview 中 getChildAt方法记录
- Android-BaseAdapter中getView()
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用
- ListView中getChildAt(index)的使用
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- ListView中getChildAt(index)的使用注意事项
- iOS动效
- FreeBSD基础安装之四 让普通用户使用su 获得root权限
- ASP.NET-GridView之导出excel或word
- 关于长按listview子项复制子项中的文本值的问题
- STL_List使用
- ListView中getChildAt()方法以及BaseAdapter中getview使用
- 如何在Visual Studio 添加自定义包含目录的宏路径
- 若不自律,则注定一无所成。
- 时下流行devops关键词:分布式架构、一体化架构和微服务架构
- 全国低于30ms响应速度:千万级魅族用户的异地多点网络
- 关于android,so库那点事~~
- Android 图片缓存处理
- 257. Binary Tree Paths
- pod里的框架不是最新的(比github里面的版本低)