Android ListView 动态设置ItemView高度为0隐藏Item

本文介绍了一种通过调整ListView中ItemView的高度来实现隐藏Item的方法,并详细解释了如何通过设置特定的标志来确保被隐藏的Item不会被复用。

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

隐藏ItemView  

前言

   在使用Adapter加载ItemView时应该使用:

inflater.inflate(R.layout.my_layout, parent, false);

  不然会导致ItemView的高度仅仅是wrap_content,除非在my_layout中再嵌套一层Layout并指定高度。
  

隐藏ItemView

  设置某一项Item的高度主要是设置该ItemView的高度,我们可以在getView中调用:
  

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        /**
         * other code
         */
        if (condition) {
            ViewGroup.LayoutParams params = v.getLayoutParams();
            params.height = 1;// 这里不能设置高度为0,然后会有一个空白
            v.setLayoutParams(params);
            v.setVisibility(View.GONE);
            ((ViewHolder) v.getTag()).needReInflate = true;
        }
        /**
         * other code
         */
    }

我们可以看到有这么一行代码:

((ViewHolder) v.getTag()).needReInflate = true;

这个是为了考虑到ListView的convertView回收机制,应为设置高度为0已经隐藏掉的Item已经不适用于ListView滚动时给其他Item复用,所以要在ViewHolder中加入一个flag标识需要重新inflate一个ItemView,具体可以看看convertView的生成代码:

View view;
ViewHolder holder;
if (convertView == null) {
    holder = new ViewHolder();
    LayoutInflater inflater = 
    (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.my_layout, parent, false);
    view.setTag(holder);
// 如果是改变过高度的ItemView,需要重新inflate一个ItemView  
} else if (((ViewHolder)convertView.getTag()).needReInflate) {
    holder = new ViewHolder();
    LayoutInflater inflater = 
    (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.my_layout, parent, false);
    view.setTag(holder);
else {
    view = convertView;
}

再来看看ViewHolder的定义:

    protected static class ViewHolder {
        View view1;
        View view2;
        View view3;

        boolean needReInflate;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值