我想在列表视图中显示/隐藏项目。目前我通过迭代适配器的数据来做到这一点。如果某个索引处的项匹配某些条件,则会调用此行:
listView.getChildAt(index).setVisibility(View.GONE);
项目不可见,但仍留有空白(令人惊讶的是View.GONE和View.INVISIBLE在这种情况下的行为相同)。
我希望实现与从适配器中删除项目并调用notifyDataSetChanged()
相同的效果,但我不想修改基础数据,只需隐藏项目。
答案 0 :(得分:5)
我已经实现了这一点,因为Tonithy建议here。在适配器的getView方法的开头添加了一个if子句,它检查item是否匹配条件以隐藏。如果是,则getView返回“null layout”。
当我想要隐藏某个项目时,我设置了一个条件并在我的列表视图上调用.invalidateViews()。
答案 1 :(得分:0)
如果不让listview知道,请不要根据内部属性返回不同的视图,您应该重复使用视图!否则您的应用程序会非常慢。例如,请查看this tutorial with benchmark。
getView(...)
- 重用convertView
!,隐藏条件!Holder
课程,让他们"倾听"到你的适配器信号/均衡并有条件地改变它们的视觉替代方法:您可以在单个列表中使用多种类型的列表项:
(shown, hidden)
,覆盖getViewTypeCount()
:return 2
getItemViewType(...)
,
is shown -> 0
is not shown -> 1
getView(...)
convertView
参数是当前项类型的视图,应该重用它,如果不是null!notifyDataSetChanged()
对于不同的稳定类型,我已经测试了这样的接近,但是即使项目类型发生更改并且让观察者知道它也应该可以工作。这种方法比你发布的方法快很多,因为你重复使用视图,不需要总是给新视图充气!
答案 2 :(得分:0)
在CustomeListAdapter的覆盖getView方法中为custom_list_item的所有UI元素调用.setVisibility(View.GONE)。
例如:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Holder holder = new Holder();
View rowView;
rowView = inflater.inflate(R.layout.custom_list_item, null);
holder.tvName = (TextView) rowView.findViewById(R.id.textViewName);
holder.img = (ImageView) rowView.findViewById(R.id.imageView1);
if (items[position].NeedForCollapsed){
System.out.println("set Visibility.Gone");
holder.tvName.setVisibility(View.GONE);
holder.img.setVisibility(View.GONE);
return rowView;
}
//new values
holder.tvName.setText(items[position].name);
holder.img.setImageResource(GetImageID(items[position]));
return rowView;
}
public class Holder
{
TextView tvName;
ImageView img;
}
或者为您的根容器调用.setVisibility(View.GONE),如LinearLayout。 祝你好运!