使用自定义ArrayAdapter隐藏GridView中的项目

时间:2013-05-24 23:00:19

标签: android android-listview android-arrayadapter

我尝试使用以下代码动态隐藏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个项目并且为两个项目调用hide函数,则getView方法被调用4次(旧大小+ 1)而不是2次(新大小) + 1)。那很奇怪不是吗?

为什么?我认为它背后的逻辑是对的不是吗?

2 个答案:

答案 0 :(得分: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回调的数量

答案 1 :(得分:0)

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