8

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

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

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

4

3 回答 3

5

正如托尼西在这里建议的那样,我已经做到了这一点。在适配器的 getView 方法的开头添加了一个 if 子句,它检查项目是否匹配要隐藏的条件。如果它确实 getView 返回“空布局”。

当我想隐藏一个项目时,我设置一个条件并在我的列表视图上调用 .invalidateViews()。

于 2013-07-18T11:49:14.820 回答
1

不要在不让 listview 知道的情况下根据内部属性返回不同的视图,您应该重用视图!否则你会做很慢的应用程序。例如,使用 benchmark 看一下本教程

  • getView(...)- 重用convertView!,有条件地隐藏它!
  • 使用Holder类,让它们“监听”您的适配器信号/偶数并有条件地改变它们的视觉效果

替代方案:您可以在单个列表中使用多种类型的列表项

  • 定义列表项类型(shown, hidden),覆盖getViewTypeCount()return 2
  • 覆盖getItemViewType(...)
    • is shown -> 0
    • is not shown -> 1
  • 更复杂getView(...)
    • 获取项目视图类型或检查它是否显示
    • 根据类型调度视图创建,不要忘记,该convertView参数是当前项目类型的视图,如果不为空,您应该重用它
  • 变更电话notifyDataSetChanged()

我已经针对不同的稳定类型测试过这样的方法,但是即使项目的类型发生变化并且您让观察者知道它,它也应该可以工作。这种方法将比您发布的方法快很多,因为您重复使用视图,不需要总是膨胀新的!

于 2015-04-17T08:41:49.970 回答
-1

为您的 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。祝你好运!

于 2016-01-18T18:42:50.580 回答