2015-10-06 76 views
0

这是我的应用程序所做的,用户可以通过搜索框进行搜索。当他键入内容并匹配时,它会过滤gridview。但是当他试图删除时,没有记录显示。 清空搜索框时,我被困在显示整个记录。Android GridView不在空搜索框中显示记录

这是我已经试过:

MainActivity.class:

etSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       adapter.getFilter().filter(cs.toString()); 


     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 

     } 

     @Override 
     public void afterTextChanged(Editable cs) { 

     } 
    }); 

CustomAdapter.class:

@Override 
public Filter getFilter() { 
    if (starsFilter == null) 
     starsFilter = new StarsFilter(); 
    return starsFilter; 
} 

private class StarsFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     // Create a FilterResults object 
     FilterResults results = new FilterResults(); 

     constraint = constraint.toString().toLowerCase(); 

     if (constraint != null && constraint.toString().length() > 0) { 
      ArrayList<HashMap<String, String>> filteredStars = new ArrayList<>(); 
      for(HashMap<String, String> item : data){ 
       if(item.toString().toLowerCase().contains(constraint)){ 
        filteredStars.add(item); 
       } 
      } 
      results.values = filteredStars; 
      results.count = filteredStars.size(); 
     } else { 
      synchronized(this) { 
       results.values = data; 
       results.count = data.size(); 
      } 
     } 

     // Return our FilterResults object 
     return results; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     data.clear(); 

     if (constraint.length() == 0) { 
      notifyDataSetInvalidated(); 
     } else { 
      for (HashMap<String, String> result : (ArrayList<HashMap<String, String>>) results.values) { 
       data.add(result); 
      } 
      notifyDataSetChanged(); 
     } 

    } 


} 

任何想法?我会很感激你的帮助。提前致谢!

+1

问题是什么?这个问题并不清楚。 – Lingviston

+0

你真的想要做什么,你在哪里阻止 – Sree

+0

@Lingviston我已更新我的帖子 –

回答

0

首先不要用单个的ArrayList调用data来存储初始结果和过滤结果。请注意,在发布结果中,您首先会清除data,因此一旦用户使用了搜索 - 原始数据部分/完全丢失。

因此,在您的适配器中有2个ArrayList,例如,其名称为originalDatafilteredData。过滤期间不得更改originalData。最初filteredData必须是originalData的副本,并且您的适配器必须始终使用filteredData作为源数据集。

在执行过滤时,您必须修改/清除/填写filteredData。如果constraint为空字符串,则必须将所有originalData内容复制到filteredData

然后在publishResults将支票从constraint.length() == 0更改为results.count == 0

+0

你可以提供示例代码?谢谢! –

+0

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/widget/ArrayAdapter.java默认的ArrayAdapter实现非常相似。主要观点是2个数据集。也许这个例子太重了,但我想我的解释可以解决你的问题。 – Lingviston

+0

谢谢你!我会仔细阅读 –