ListView显示上次传递的数据以及当前的传球

时间:2012-09-14 15:21:12

标签: java android listview android-adapterview

我正在进行一项小型“搜索”实施。 listView显示与查询匹配的项目。这样可以正常工作,但无论何时隐藏并重新显示菜单并进行新查询,所有“搜索”都会继续堆叠。如果我有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;
    }           
}

3 个答案:

答案 0 :(得分:1)

尝试清除menuItems中的列表项,然后在创建新查询后添加项。 是尝试清除menuItems中的listitems,然后在新查询成为arraylist之后添加项目吗?

答案 1 :(得分:1)

很难确定您发布的内容,但我猜您将新结果附加到menuItems,而不是将其替换为新数据。

答案 2 :(得分:0)

我不太了解你的问题。但只要看一下你的代码我就会看到一个问题

if (!isSearching) {
            convertView = inflater.inflate(R.layout.rbm_item, null);
        } else {
            convertView = inflater.inflate(R.layout.rbm_search_item, null);                 
        }

这件作品可能是您遇到问题的原因。 列表适配器的getView方法被非常频繁地调用,因此它应该包含最小和较重的操作。

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

Google关于Android的高效适配器示例。