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;
    }
阅读更多
个人分类: Android基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭