关闭

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

标签: androidandroid listview布局隐藏Item设置Item高度
1469人阅读 评论(2) 收藏 举报
分类:

隐藏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;
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4171次
    • 积分:94
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论