在过滤listview时清除数据后,我没有获得原始listview android?

在过滤listview时清除数据后,我没有获得原始listview android?,android,listview,Android,Listview,我在适配器类中实现了一个过滤器方法,如下所示 public class EntryAdapter extends ArrayAdapter<Item> implements Filterable { private Context context; private ArrayList<Item> items; private ArrayList<Item> fitems; private LayoutInflater vi;

我在适配器类中实现了一个过滤器方法,如下所示

public class EntryAdapter extends ArrayAdapter<Item> implements Filterable {

    private Context context;
    private ArrayList<Item> items;
    private ArrayList<Item> fitems;
    private LayoutInflater vi;
    private contact contact;
     private ItemsFilter mFilter;
    public EntryAdapter(Context context,ArrayList<Item> items) {
        super(context,0, items);
        this.context = context;
        this.contact=(contact) context;
        this.items = items;
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

@Override
public int getCount() {
    // TODO Auto-generated method stub

    return items.size();
}

@Override
public Item getItem(int position) {
    // TODO Auto-generated method stub
    return super.getItem(position);
}

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

        final Item i = items.get(position);

        if (i != null) {
            if(i.isSection()){
                SectionItem si = (SectionItem)i;
                v = vi.inflate(R.layout.list_item_section, null);

                v.setOnClickListener(null);
                v.setOnLongClickListener(null);
                v.setLongClickable(false);

                final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
                sectionView.setText(si.getTitle());

            }else{
                EntryItem ei = (EntryItem)i;
                v = vi.inflate(R.layout.entrylist, null);
                final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
                final TextView subtitle = (TextView)v.findViewById(R.id.list_item_entry_summary);


                if (title != null) 
                    title.setText(ei.title);
                if(subtitle != null)
                    subtitle.setText(ei.subtitle);
            }
        }
        return v;
    }

     public Filter getFilter() {
            if (mFilter == null) {
                mFilter = new ItemsFilter();
            }
            return mFilter;

        }

     private class ItemsFilter extends Filter{

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint == null || constraint.length() == 0){
                results.values = items;
                results.count = items.size();

            }
            else{

                 ArrayList<Item> itemsList = new ArrayList<Item>();

                 for (Item i : items){

                     if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
                            itemsList.add(i);
                 }
                 results.values = itemsList;
                    results.count = itemsList.size();
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
             if (results.count == 0){

                 notifyDataSetInvalidated();
             }
             else{

                 ArrayList<Item> lst = (ArrayList<Item>)results.values;
                 ArrayList<Item> itemsList = new ArrayList<Item>(lst);
                 //this.items=mItems;
                items =itemsList;              
                notifyDataSetChanged();
             }

        }


     }

}

过滤工作正常,但当我按键盘上的交叉按钮时,我无法返回原始列表视图。我只得到我过滤过的数据。我希望如果用户再次将EditText设置为空,则应加载原始列表视图。

您正在将过滤后的数据分配给原始列表,这就是您无法获取原始列表的原因。

您应该将筛选结果列表分配给fitems。 e、 g

fitems=(ArrayList)results.values;
notifyDataSetChanged();
好的,请尝试以下改进代码:--

公共类EntryAdapter扩展ArrayAdapter实现可过滤{
私人语境;
私有ArrayList项;
私人ArrayList fitems;
私人停车场6号;
私人接触;
私人物品过滤器;
公共入口适配器(上下文、ArrayList项){
超级(上下文,0,项);
this.context=上下文;
this.contact=(contact)上下文;
这个项目=项目;
this.fitems=新的ArrayList();
vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回items.size();
}
@凌驾
公共项getItem(int位置){
//TODO自动生成的方法存根
返回super.getItem(位置);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
最终项目i=fitems.get(位置);
如果(i!=null){
if(i.isSection()){
SectionItem si=(SectionItem)i;
v=vi.充气(R.布局.列表项目部分,空);
v、 setOnClickListener(空);
v、 setOnLongClickListener(空);
v、 设置长点击(假);
最终文本视图部分视图=(文本视图)v.findViewById(R.id.list\u item\u section\u text);
sectionView.setText(si.getTitle());
}否则{
EntryItem ei=(EntryItem)i;
v=vi.充气(R.布局.入口列表,空);
最终文本视图标题=(文本视图)v.findViewById(R.id.list\u item\u entry\u title);
最终文本视图字幕=(文本视图)v.findViewById(R.id.list\u item\u entry\u summary);
如果(标题!=null)
title.setText(ei.title);
如果(副标题!=null)
subtitle.setText(ei.subtitle);
}
}
返回v;
}
公共过滤器getFilter(){
if(mFilter==null){
mFilter=newitemsfilter();
}
返回过滤器;
}
私有类ItemsFilter扩展了筛选器{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
ArrayList FilteredArrList=新的ArrayList();
if(constraint==null | | constraint.length()==0){
结果值=项目;
results.count=items.size();
}
否则{
constraint=constraint.toString().toUpperCase();
ArrayList itemsList=新的ArrayList();
用于(项目i:项目){
if(i.toString().toUpperCase().startsWith(约束))
添加(i);
}
results.values=FilteredArrList;
results.count=filterDarrList.size();
}
返回结果;
}
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
fitems=(ArrayList)results.values;
notifyDataSetChanged();
}
}
}

请为您正在做的事情添加一些解释。现在请再试一次。我刚刚编辑了代码,它肯定会工作的。。实际上,在getView方法中,您只需要使用fItems(过滤列表)。。!
search.addTextChangedListener(new TextWatcher() {

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        //s= items.toString();
                        contact.this.adapter.getFilter().filter(s.toString());
                        adapter.notifyDataSetChanged();
                    }
   fitems = (ArrayList<Item>) results.values;
            notifyDataSetChanged();
public class EntryAdapter extends ArrayAdapter<Item> implements Filterable {

private Context context;
private ArrayList<Item> items;
private ArrayList<Item> fitems;
private LayoutInflater vi;
private contact contact;
 private ItemsFilter mFilter;
public EntryAdapter(Context context,ArrayList<Item> items) {
    super(context,0, items);
    this.context = context;
    this.contact=(contact) context;
    this.items = items;
    this.fitems = new ArrayList<Item>(); 
    vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
// TODO Auto-generated method stub

return items.size();
}

@Override
public Item getItem(int position) {
// TODO Auto-generated method stub
return super.getItem(position);
}

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

    final Item i = fitems.get(position);

    if (i != null) {
        if(i.isSection()){
            SectionItem si = (SectionItem)i;
            v = vi.inflate(R.layout.list_item_section, null);

            v.setOnClickListener(null);
            v.setOnLongClickListener(null);
            v.setLongClickable(false);

            final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
            sectionView.setText(si.getTitle());

        }else{
            EntryItem ei = (EntryItem)i;
            v = vi.inflate(R.layout.entrylist, null);
            final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
            final TextView subtitle = (TextView)v.findViewById(R.id.list_item_entry_summary);


            if (title != null) 
                title.setText(ei.title);
            if(subtitle != null)
                subtitle.setText(ei.subtitle);
        }
    }
    return v;
}

 public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new ItemsFilter();
        }
        return mFilter;

    }

  private class ItemsFilter extends Filter{

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
       ArrayList<Item> FilteredArrList = new ArrayList<Item>();
        if (constraint == null || constraint.length() == 0){
            results.values = items;
            results.count = items.size();

        }
        else{
             constraint = constraint.toString().toUpperCase();
             ArrayList<Item> itemsList = new ArrayList<Item>();

             for (Item i : items){

                 if (i.toString().toUpperCase().startsWith(constraint))
                        FilteredArrList.add(i);
             }
             results.values = FilteredArrList;
                results.count = FilteredArrList.size();
        }

        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
     fitems = (ArrayList<Item>) results.values;
                notifyDataSetChanged();
    }
 }

 }