正确隐藏listview中的项目

时间:2013-07-18 10:29:16

标签: android android-listview hide

我想在列表视图中显示/隐藏项目。目前我通过迭代适配器的数据来做到这一点。如果某个索引处的项匹配某些条件,则会调用此行:

listView.getChildAt(index).setVisibility(View.GONE);

项目不可见,但仍留有空白(令人惊讶的是View.GONE和View.INVISIBLE在这种情况下的行为相同)。 我希望实现与从适配器中删除项目并调用notifyDataSetChanged()相同的效果,但我不想修改基础数据,只需隐藏项目。

3 个答案:

答案 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。 祝你好运!