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

隐藏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;
    }
ListView中,每个item高度通常是动态计算的,因为它们的内容可能会因数据变化而不同。然而,你可以通过以下几个步骤来大致控制或设置ListView item高度: 1. **固定高度**:如果你想要每个item都有相同的高度,可以使用`android:height`属性直接在XML布局文件中的`<ListView>`元素里设置。例如: ```xml <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:itemHeight="60dp" /> ``` 这将让所有item都保持60像素的高度。 2. **自适应高度**:更常见的做法是让item根据内部内容自动调整高度。这通常涉及到给列表项的视图设置一个填充父容器的布局,比如`LinearLayout`、`RecyclerView`等,并为其设置合适的测量策略(如`android:layout_weight`或`wrap_content`)。 3. **监听事件**:在Activity或Fragment中,可以监听`OnMeasure`或`onLayoutChangeListener`,然后根据item的实际大小动态更新高度。 4. **使用Adapter设置ViewHolder**:如果使用了适配器(Adapter),如ArrayAdapter或BaseAdapter,你可以在`getView()`方法中处理每个item高度,根据ViewHolder的高度计算来设置。 ```java @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false)); // ... 初始化并保存ViewHolder } else { viewHolder = (ViewHolder) convertView.getTag(); } // 设置item高度 viewHolder.itemView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, calculateItemHeight(viewHolder))); return viewHolder.itemView; } private int calculateItemHeight(ViewHolder viewHolder) { // 根据viewHolder中的内容计算高度 } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值