我尝试使用以下代码动态隐藏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)。那很奇怪不是吗?
为什么?我认为它背后的逻辑是对的不是吗?
答案 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()
必须返回可见的项目数。