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