ListView中getChildAt()方法以及BaseAdapter中getview使用

在项目开发中,为了动态更新ListView标题栏下拉框的item,作者探讨了实现带有未读信息红点的三种方法。方法一利用getChildAt()无法在下拉框显示前操作,方法二通过BaseAdapter的getView()在所有item显示后才能获取信息,最后采用方法三,在getView()内判断并添加红点,以提高效率和用户体验。

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

效果图
一、概述
在项目开发过程中,需要动态更新标题栏上下拉框中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();
            }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值