0

我尝试使用以下代码动态隐藏 GridView 中的一些项目:

public class GridHelper extends ArrayAdapter<Object>
{
    private Context context; 
    private int layoutResourceId;    

    private ArrayList<Object> mainlist = null;
    private ArrayList<Object> sichtbar = null;

    public GridHelper(Context context, int layoutResourceId, ArrayList<Object> mainlist) 
    {
        super(context, layoutResourceId, mainlist);

        this.layoutResourceId = layoutResourceId;
        this.context = context;

        this.mainlist = mainlist;
        this.sichtbar = ArrayList<Object>(); 
        // that's important otherwith the items are doublicated but the items 
        // are inside the List. I think the add method is called somewhere 
        // in the super constructor
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View row = convertView;

        if(row == null)
        {           
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, null);

            Object t = sichtbar.get(position);

            if(t != null)
           {
                row = (View) t;
           }
        }

        return row;
    }

    @Override
    public int getCount() 
    {
        return sichtbar.size();
    }

    @Override
    public void add(Object object)
    {
        super.add(object);
        sichtbar.add(object);
    }

    public void show(int pos)
    {
        if(sichtbar.contains(mainlist.get(pos)) == false)
        {
            sichtbar.add(mainlist.get(pos));
            notifyDataSetChanged();
        }
    }

    public void hide(int pos)
    {
        if(sichtbar.contains(mainlist.get(pos)) == true)
        {
            sichtbar.remove(mainlist.get(pos)); 
            notifyDataSetChanged();
        }
    }
}

但是搜索功能不起作用。该列表在我的显示/隐藏方法之后具有正确的大小,但第一项 ( mainlist .get(0)) 始终可见,我认为它涵盖了正确的项目。我发现该getView方法的调用次数总是比列表的大小多一倍。如果列表有 3 个项目,则该getView方法被调用 4 次,依此类推。

第二件事是:如果我的 GridView 中有 3 个项目并为两个项目调用隐藏函数,则该getView方法被调用 4 次(旧尺寸 + 1),然后再调用 2 次(新尺寸 + 1)。这很奇怪不是吗?

这是为什么?我认为它背后的逻辑是正确的,不是吗?

4

2 回答 2

2

你的第一个项目总是可见的(你可以看到 getCount 第一个项目(因为在你的内部你getView总是返回第一个元素。

在我看来,您的 sichtbar 包含您想要在 GridView 中显示的 Views 实例。如果您已经膨胀了这个元素,imo,您的 getView 应该如下所示:

public View getView(int position, View convertView, ViewGroup parent) 
    {
        View row = convertView;
        row = (sichtbar.get(position) != null) ? (View)sichtbar.get(position) : row;
        return row;
    }

第二件事是:如果我的 GridView 中有 3 个项目并为两个项目调用隐藏函数,则 getView 方法被调用 4 次(旧大小 + 1),然后再调用 2 次(新大小 + 1)。这很奇怪不是吗?

无法保证调用 getView 回调的数量

于 2013-06-02T10:03:39.530 回答
0

我认为最简单的方法是在适配器中维护 2 个单独的列表。一个包含所有项目,另一个仅包含可见的项目。或者一个包含可见项目,另一个包含不可见项目。两者都是可能的。请记住,getCount()必须返回可见项目的数量。

于 2013-05-24T23:12:50.987 回答