Java ListView显示上次通过的数据以及当前pas的数据

Java ListView显示上次通过的数据以及当前pas的数据,java,android,listview,android-adapterview,Java,Android,Listview,Android Adapterview,我有一个小的“搜索”实现,我正在工作。列表视图显示与查询匹配的项目。这很好,但是每当菜单被隐藏并重新显示,并且进行新的查询时,所有的“可搜索项”都会继续堆积起来。如果我有4个应该显示的,首先它会显示4个,然后是8个,然后是12个,以此类推 private class Adapter extends BaseAdapter { private LayoutInflater inflater; public Adapter(){ inflater = Layout

我有一个小的“搜索”实现,我正在工作。列表视图显示与查询匹配的项目。这很好,但是每当菜单被隐藏并重新显示,并且进行新的查询时,所有的“可搜索项”都会继续堆积起来。如果我有4个应该显示的,首先它会显示4个,然后是8个,然后是12个,以此类推

private class Adapter extends BaseAdapter {

    private LayoutInflater inflater;

    public Adapter(){
        inflater = LayoutInflater.from(getContext());
    }

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

    @Override
    public Object getItem(int position) {
        return menuItems.get(position).text;
    }

    @Override
    public long getItemId(int position) {
        return menuItems.get(position).id;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder = new ViewHolder(); 
            if (!isSearching) {
                convertView = inflater.inflate(R.layout.rbm_item, null);
            } else {
                convertView = inflater.inflate(R.layout.rbm_search_item, null);                 
            }
            holder.subMenuList = (LinearLayout) convertView.findViewById(R.id.sub_holder);
            holder.text = (TextView) convertView.findViewById(R.id.rbm_item_text);  

            convertView.setTag(holder);
            convertView.setOnClickListener(new OnClickListener() {
                @Override 
                public void onClick(View v) {
                    if (holder.subMenuList.getVisibility() == View.VISIBLE) {
                        holder.subMenuList.setVisibility(View.GONE);
                    } else {
                        holder.subMenuList.setVisibility(View.VISIBLE);
                    }
                }
            });

            if (isSearching) {
                holder.image = (ImageView) convertView.findViewById(R.id.rbm_item_icon);
                holder.image.setImageResource(menuItems.get(position).icon);    
                holder.chapterId = (TextView) convertView.findViewById(R.id.id_text);
                holder.chapterId.setText("Ch"+Integer.toString(menuItems.get(position).id));
            } else {
                holder.chapterId = (TextView) convertView.findViewById(R.id.rbm_item_id);
                holder.chapterId.setText(Integer.toString(menuItems.get(position).id));
            }
            holder.text.setText(menuItems.get(position).text);
            if (!isSearching) {
                for (int i=0;i<menuItems.get(position).subItems.size();i++) {
                    TextView tv = new TextView(ctx);
                    tv.setTextColor(0xFF893658);
                    tv.setText(menuItems.get(position).subItems.get(i).getTitle());
                    tv.setCompoundDrawablesWithIntrinsicBounds(menuItems.get(position).subItems.get(i).getIcon(), 0, 0, 0);
                    tv.setCompoundDrawablePadding(5);
                    if (i == 0) {
                        if (menuItems.get(position).subItems.size() == 1) {
                            tv.setPadding(20, 20, 0, 20);
                        } else{
                            tv.setPadding(20, 20, 0, 10);
                        }
                    } else if (i == menuItems.get(position).subItems.size()-1){
                        tv.setPadding(20, 10, 0, 20);
                    } else {
                        tv.setPadding(20, 10, 0, 10);
                    }
                    holder.subMenuList.addView(tv);
                }
            } 

        return convertView;
    }

    class ViewHolder {
        TextView text;
        ImageView image;
        LinearLayout subMenuList;
        TextView chapterId;
    }           
}
私有类适配器扩展BaseAdapter{
私人充气机;
公共适配器(){
充气器=LayoutInflater.from(getContext());
}
@凌驾
public int getCount(){
返回menuItems.size();
}
@凌驾
公共对象getItem(int位置){
返回menuItems.get(position).text;
}
@凌驾
公共长getItemId(int位置){
返回menuItems.get(position.id);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终视图持有者=新的视图持有者();
如果(!正在搜索){
convertView=充气机。充气(R.layout.rbm_项,空);
}否则{
convertView=充气机。充气(R.layout.rbm\u搜索项,空);
}
holder.subnumlist=(LinearLayout)convertView.findViewById(R.id.sub_holder);
holder.text=(TextView)convertView.findViewById(R.id.rbm_item_text);
convertView.setTag(支架);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(holder.subnumlist.getVisibility()==View.VISIBLE){
holder.subnumlist.setVisibility(View.GONE);
}否则{
holder.subnumlist.setVisibility(View.VISIBLE);
}
}
});
如果(正在搜索){
holder.image=(ImageView)convertView.findViewById(R.id.rbm_item_图标);
holder.image.setImageResource(menuItems.get(position.icon));
holder.chapterId=(TextView)convertView.findViewById(R.id.id\u text);
holder.chapterId.setText(“Ch”+Integer.toString(menuItems.get(position.id));
}否则{
holder.chapterId=(TextView)convertView.findViewById(R.id.rbm\u item\u id);
holder.chapterId.setText(Integer.toString(menuItems.get(position.id));
}
holder.text.setText(menuItems.get(position.text));
如果(!正在搜索){

对于(int i=0;i尝试清除菜单项中的listitems,然后在进行新查询后重新添加这些项。
是否尝试清除菜单项中的列表项,然后在新查询生成arraylist或其他内容后重新添加这些项?

很难从您发布的内容中确定,但我猜您是在将新结果附加到菜单项,而不是用新数据替换它。

我不太了解您的问题。bu我只是浏览了一下你的代码,就发现了一个问题

if (!isSearching) {
            convertView = inflater.inflate(R.layout.rbm_item, null);
        } else {
            convertView = inflater.inflate(R.layout.rbm_search_item, null);                 
        }
这一块可能是你的问题的原因。 列表适配器的getView方法被频繁调用,所以它应该包含最少且不太繁重的操作

如果您要检查列表适配器的默认示例,您将看到convertView被检查为空,这样它就不需要再次膨胀,并且再次被重用,以便更快地准备显示在列表中的视图。 这不会发生在你的代码中


谷歌关于高效适配器示例Android。

你如何将新的可搜索结果放入
菜单项中
?你从哪里获得菜单项以及菜单项是什么?部分问题是你总是在创建一个新的ListView项,你从来没有使用适配器的回收器……你能告诉代码你是怎么做的吗that@Sam,corr等等。这导致了很多问题。我重复使用列表、人员和适配器执行许多不同的任务。删除该检查是它工作的唯一方法。列表的长度永远不会超过10左右,因此不应该有巨大的形式影响。当菜单“显示”时,我清除了menuItems中的所有数据,但我可以尝试在查询更改时清除它们。您的问题得到解决方案了吗?是的。就是这样。我有一个文本监视程序,所以每次查询字符串更改时我都会清除菜单项。看起来有点过火,但它工作正常,所以我不会抱怨