Android自定义listView适配器筛选器不返回原始列表

Android自定义listView适配器筛选器不返回原始列表,android,baseadapter,Android,Baseadapter,我已经编辑了适配器类并扩展了可过滤类。我的搜索功能正常,但如果我将搜索菜单中的所有内容退格,则无法返回原始内容 以下是我的适配器类: public class Menu_List_Item_Adapter extends BaseAdapter implements Filterable { Context context; List<FoodMenuRowItem> rowItems; public Menu_List_Item_Adapter(Context context,

我已经编辑了适配器类并扩展了可过滤类。我的搜索功能正常,但如果我将搜索菜单中的所有内容退格,则无法返回原始内容

以下是我的适配器类:

public class Menu_List_Item_Adapter extends BaseAdapter implements Filterable {
Context context;
List<FoodMenuRowItem> rowItems;

public Menu_List_Item_Adapter(Context context, List<FoodMenuRowItem> items) {
    this.context = context;
    this.rowItems = items;
}   
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
    TextView txtDesc;
}

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

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.food_menu_item_list_row,
                null);
        holder = new ViewHolder();
        holder.txtDesc = (TextView) convertView.findViewById(R.id.price);
        holder.txtTitle = (TextView) convertView
                .findViewById(R.id.description);
        holder.imageView = (ImageView) convertView.findViewById(R.id.img);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    FoodMenuRowItem rowItem = (FoodMenuRowItem) getItem(position);

    holder.txtDesc.setText(rowItem.getDesc());
    holder.txtTitle.setText(rowItem.getTitle());
    holder.imageView.setImageResource(rowItem.getImageId());

    return convertView;
}

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

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

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

@Override
public Filter getFilter() {
    return new Filter() {
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {

            if (results.count == 0)
                notifyDataSetInvalidated();
            else {
                rowItems = (List<FoodMenuRowItem>) results.values;
                Menu_List_Item_Adapter.this.notifyDataSetChanged();
            }

        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();

            if (constraint == null || constraint.length() == 0) {
                // No filter implemented we return all the list
                results.values = rowItems;
                results.count = rowItems.size();

            } else { // We perform filtering operation
                List<FoodMenuRowItem> filteredRowItems = new ArrayList<FoodMenuRowItem>();

                for (FoodMenuRowItem p : rowItems) {
                    if (p.getName()
                            .toUpperCase()
                            .startsWith(constraint.toString().toUpperCase())) {
                        filteredRowItems.add(p);
                    }
                }
                results.values = filteredRowItems;
                results.count = filteredRowItems.size();
            }
            return results;
        }
    };
}
公共类菜单\u列表\u项\u适配器扩展BaseAdapter实现可过滤{
语境;
列出项目;
公共菜单\列表\项\适配器(上下文上下文,列表项){
this.context=上下文;
this.rowItems=项目;
}   
私有类视窗持有者{
图像视图图像视图;
TextView-txtTitle;
TextView-txtDesc;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
LayoutInflater mInflater=(LayoutInflater)上下文
.getSystemService(活动.布局\充气机\服务);
if(convertView==null){
convertView=mInflater.充气(R.layout.food\u menu\u item\u list\u row,
无效);
holder=新的ViewHolder();
holder.txtDesc=(TextView)convertView.findViewById(R.id.price);
holder.txtTitle=(TextView)convertView
.findViewById(R.id.说明);
holder.imageView=(imageView)convertView.findViewById(R.id.img);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
FoodMenuRowItem rowItem=(FoodMenuRowItem)getItem(位置);
holder.txtDesc.setText(rowItem.getDesc());
holder.txtitle.setText(rowItem.getTitle());
holder.imageView.setImageResource(rowItem.getImageId());
返回视图;
}
@凌驾
public int getCount(){
返回rowItems.size();
}
@凌驾
公共对象getItem(int位置){
返回行项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回rowItems.indexOf(getItem(position));
}
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@抑制警告(“未选中”)
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
如果(results.count==0)
notifyDataSetionValidated();
否则{
rowItems=(列表)results.values;
菜单\列表\项\适配器。this.notifyDataSetChanged();
}
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
if(constraint==null | | constraint.length()==0){
//没有实现过滤器,我们返回所有列表
results.values=行项目;
results.count=rowItems.size();
}否则{//我们将执行筛选操作
List filteredRowItems=new ArrayList();
对于(FoodMenuRowItem p:rowItems){
if(p.getName()
.toUpperCase()
.startsWith(constraint.toString().toUpperCase()){
添加(p);
}
}
结果.values=过滤器读数;
results.count=filteredRowItems.size();
}
返回结果;
}
};
}
}

我检查结果是零还是空,如果是,返回原始列表?
我缺少什么?

您应该存储行项目以返回到它,然后在搜索区域中获取空文本后,您应该将该数组恢复到行项目中,以便适配器可以重新加载自身。比如:

public class Menu_List_Item_Adapter extends BaseAdapter implements Filterable {
Context context;
List<FoodMenuRowItem> rowItems;
List<FoodMenuRowItem> storedRowItems;

public Menu_List_Item_Adapter(Context context, List<FoodMenuRowItem> items) {
this.context = context;
this.rowItems = items;
this.storedRowItems = new List<FoodMenuRowItem>(items);
}   

// ...

@Override
public Filter getFilter() {
return new Filter() {
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {

        if (results.count == 0)
            notifyDataSetInvalidated();
        else {
            rowItems = (List<FoodMenuRowItem>) results.values;
            Menu_List_Item_Adapter.this.notifyDataSetChanged();
        }

    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults results = new FilterResults();

        if (constraint == null || constraint.length() == 0) {
            // No filter implemented we return all the list
            results.values = storedRowItems;
            results.count = storedRowItems.size();

        } else { // We perform filtering operation
            List<FoodMenuRowItem> filteredRowItems = new ArrayList<FoodMenuRowItem>();

            rowItems = storedRowItems;
            for (FoodMenuRowItem p : rowItems) {
                if (p.getName()
                        .toUpperCase()
                        .startsWith(constraint.toString().toUpperCase())) {
                    filteredRowItems.add(p);
                }
            }
            results.values = filteredRowItems;
            results.count = filteredRowItems.size();
        }
        return results;
    }
};
}
公共类菜单\u列表\u项\u适配器扩展BaseAdapter实现可过滤{
语境;
列出项目;
列出仓库地址;
公共菜单\列表\项\适配器(上下文上下文,列表项){
this.context=上下文;
this.rowItems=项目;
this.storedRowItems=新列表(项目);
}   
// ...
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@抑制警告(“未选中”)
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
如果(results.count==0)
notifyDataSetionValidated();
否则{
rowItems=(列表)results.values;
菜单\列表\项\适配器。this.notifyDataSetChanged();
}
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
if(constraint==null | | constraint.length()==0){
//没有实现过滤器,我们返回所有列表
结果.values=storedRowItems;
results.count=storedRowItems.size();
}否则{//我们将执行筛选操作
List filteredRowItems=new ArrayList();
rowItems=storedRowItems;
对于(FoodMenuRowItem p:rowItems){
if(p.getName()
.toUpperCase()
.startsWith(constraint.toString().toUpperCase()){
添加(p);
}
}
结果.values=过滤器读数;
results.count=filteredRowItems.size();
}
返回结果;
}
};
}

您应该存储rowItems以返回到它,然后在搜索区域中获取空文本后,您应该将该数组还原到rowItems中,以便适配器可以重新加载自身。类似于:

public class Menu_List_Item_Adapter extends BaseAdapter implements Filterable {
Context context;
List<FoodMenuRowItem> rowItems;
List<FoodMenuRowItem> storedRowItems;

public Menu_List_Item_Adapter(Context context, List<FoodMenuRowItem> items) {
this.context = context;
this.rowItems = items;
this.storedRowItems = new List<FoodMenuRowItem>(items);
}   

// ...

@Override
public Filter getFilter() {
return new Filter() {
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {

        if (results.count == 0)
            notifyDataSetInvalidated();
        else {
            rowItems = (List<FoodMenuRowItem>) results.values;
            Menu_List_Item_Adapter.this.notifyDataSetChanged();
        }

    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults results = new FilterResults();

        if (constraint == null || constraint.length() == 0) {
            // No filter implemented we return all the list
            results.values = storedRowItems;
            results.count = storedRowItems.size();

        } else { // We perform filtering operation
            List<FoodMenuRowItem> filteredRowItems = new ArrayList<FoodMenuRowItem>();

            rowItems = storedRowItems;
            for (FoodMenuRowItem p : rowItems) {
                if (p.getName()
                        .toUpperCase()
                        .startsWith(constraint.toString().toUpperCase())) {
                    filteredRowItems.add(p);
                }
            }
            results.values = filteredRowItems;
            results.count = filteredRowItems.size();
        }
        return results;
    }
};
}
公共类菜单\u列表\u项\u适配器扩展BaseAdapter实现可过滤{
语境;
列出项目;
列出仓库地址;
公共菜单\列表\项\适配器(上下文上下文,列表项){
this.context=上下文;
this.rowItems=项目;
this.storedRowItems=新列表(项目);
}   
// ...
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@抑制警告(“未选中”)
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
if(results.count)=
    this.tempitems=items;
        for (int i = 0; i < tempitems.size(); i++) {
        filterableString = tempitems.get(i);
        if (filterableString.getUserName().toLowerCase()
                .contains(filterString)) {
            Filtered_Names.add(filterableString);

            Log.v("riyas:" + filterableString.getUserName(),
                    "riyas filtering");
        }
    }