我想在我的列表视图中显示/隐藏项目。目前我通过遍历适配器的数据来做到这一点。如果某个索引处的项目匹配某个条件,则调用此行:
listView.getChildAt(index).setVisibility(View.GONE);
项目不可见,但仍有空白(令人惊讶的是 View.GONE 和 View.INVISIBLE 在这种情况下的行为相同)。我想达到与从适配器中删除并notifyDataSetChanged()
调用项目相同的效果,但我不想修改底层数据,只是隐藏项目。
我想在我的列表视图中显示/隐藏项目。目前我通过遍历适配器的数据来做到这一点。如果某个索引处的项目匹配某个条件,则调用此行:
listView.getChildAt(index).setVisibility(View.GONE);
项目不可见,但仍有空白(令人惊讶的是 View.GONE 和 View.INVISIBLE 在这种情况下的行为相同)。我想达到与从适配器中删除并notifyDataSetChanged()
调用项目相同的效果,但我不想修改底层数据,只是隐藏项目。
正如托尼西在这里建议的那样,我已经做到了这一点。在适配器的 getView 方法的开头添加了一个 if 子句,它检查项目是否匹配要隐藏的条件。如果它确实 getView 返回“空布局”。
当我想隐藏一个项目时,我设置一个条件并在我的列表视图上调用 .invalidateViews()。
不要在不让 listview 知道的情况下根据内部属性返回不同的视图,您应该重用视图!否则你会做很慢的应用程序。例如,使用 benchmark 看一下本教程。
getView(...)
- 重用convertView
!,有条件地隐藏它!Holder
类,让它们“监听”您的适配器信号/偶数并有条件地改变它们的视觉效果替代方案:您可以在单个列表中使用多种类型的列表项:
(shown, hidden)
,覆盖getViewTypeCount()
:return 2
getItemViewType(...)
,
is shown -> 0
is not shown -> 1
getView(...)
convertView
参数是当前项目类型的视图,如果不为空,您应该重用它!notifyDataSetChanged()
我已经针对不同的稳定类型测试过这样的方法,但是即使项目的类型发生变化并且您让观察者知道它,它也应该可以工作。这种方法将比您发布的方法快很多,因为您重复使用视图,不需要总是膨胀新的!
为您的 custom_list_item 的所有 UI 元素调用 .setVisibility(View.GONE) 以覆盖您的 CustomeListAdapter 的 getView 方法。
例如:
@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。祝你好运!