2017-09-16 21 views
0

Image 1 : before any search performed当搜索功能启动和适配器进行更新定制的ListView删除列表中的项目的每一件事情,除了匹配搜索值

Image 2 : after search performed

public class classBidAdapter extends ArrayAdapter<classBidAttributes> 
    implements Filterable { 

    ArrayList<classBidAttributes> data; 
    Context context; 
    CustemFilrer filter; 

//------this is a snippit of my listview custom adapter related to the search/filter function---------------------------------------------------------- 

@NonNull 
@Override 
public Filter getFilter() { 
    if(filter == null){ 
     filter = new CustemFilrer(); 
    } 
    return filter; 
} 

    class CustemFilrer extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      if(constraint != null && constraint.length()>0){ 
       constraint = constraint.toString(); 

       ArrayList<classBidAttributes> filter = new ArrayList<classBidAttributes>(); 
       for(int i =0; i<data.size();i++){ 
        if(data.get(i).getTitle().contains(constraint)){ 

         classBidAttributes filts = new classBidAttributes(data.get(i).getTitle()); 

         filter.add(filts); 

         Toast.makeText(Context, "111"+filts, Toast.LENGTH_SHORT).show(); 
        } 
       } 

       results.count = filter.size(); 
       results.values=filter; 
       Toast.makeText(Context, "222"+filter.size() +"/"+filter, Toast.LENGTH_SHORT).show(); 

      }else{ 
       results.count = data.size(); 
       results.values=data; 
       Toast.makeText(Context, ""+data.size() +"/"+data, Toast.LENGTH_SHORT).show(); 

      } 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      data.clear(); 
      data.addAll((ArrayList<classBidAttributes>) results.values); 
      notifyDataSetChanged(); 
     } 
    } 

我猜问题是在“data.clear()notifyDataSetChanged()”但我不知道这里有什么错。

我已经添加了图片,解释执行搜索时发生的情况。

hopfully这是这个问题所需的每一件事情,如果你需要检查任何事情问我。

+0

检查我的答案 –

+0

感谢的人就是这样,它的工作就好了 – user3207637

回答

0

你的猜测是正确的。您在data.clear()中犯了错误。通过这样做,您可以清除适配器的完整数据并添加最后的搜索结果。所以下次你无法获得原始数据再次开始过滤。

您应该将原始数据保存在另一个列表中,以便稍后使用适配器数据更新它。

您的代码应该是这样的:

public class classBidAdapter extends ArrayAdapter<classBidAttributes> 
    implements Filterable { 

    ArrayList<classBidAttributes> data; 
    ArrayList<classBidAttributes> original= new ArrayList<>(); 
    Context context; 
    CustemFilrer filter; 

    public classBidAdapter(Context context, ArrayList<classBidAttributes> data){ 
     this.context = context; 
     this.data = data; 
     original.addAll(data); 
    } 
} 

//------this is a snippit of my listview custom adapter related to the search/filter function---------------------------------------------------------- 

@NonNull 
@Override 
public Filter getFilter() { 
    if(filter == null){ 
     filter = new CustemFilrer(); 

    } 
    return filter; 
} 

    class CustemFilrer extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      if(constraint != null && constraint.length()>0){ 
       constraint = constraint.toString(); 

       ArrayList<classBidAttributes> filter = new ArrayList<classBidAttributes>(); 
       for(int i =0; i<data.size();i++) { 
        if (data.get(i).getTitle().contains(constraint)) { 
         classBidAttributes filts = new classBidAttributes(data.get(i).getTitle()); 
         filter.add(filts); 
         Toast.makeText(Context, "111" + filts, Toast.LENGTH_SHORT).show(); 
        } 
       } 
       results.count = filter.size(); 
       results.values=filter; 
       Toast.makeText(Context, "222"+filter.size() +"/"+filter, Toast.LENGTH_SHORT).show(); 
      }else{ 
       results.count = original.size(); 
       results.values=original; 
       Toast.makeText(Context, ""+original.size() +"/"+original, Toast.LENGTH_SHORT).show(); 
      } 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      data.clear(); 
      data.addAll((ArrayList<classBidAttributes>) results.values); 
      notifyDataSetChanged(); 
     } 
    } 

希望它能帮助:)

+0

听起来不错......为解u提供它的工作,但仍然快乐编码:) –

+0

首先感谢我有一个奇怪的错误,我无法解释,当我开始搜索时,我的第一个字符搜索工作良好的筛选项目,但当我在第二个字符图像消失,而是显示图像网址从Firebase提供,等等如果我插入第三个字符它再次显示图像,第四显示Url,我真的没有得到这种错误背后的逻辑,我的猜测是循环,当我搜索数字它不起作用尽管在搜索适配器内调用了作为字符串的变量保持号 – user3207637

+0

发布完整的适配器代码 –

0

我终于成功地使其与没有错误正常工作什么那么,它竟然是循环是问题的根源,它最好避开正常的循环,而使用foreach循环,我必须从头rewirte整个代码的搜索适配器,但如下:

  public void filter(CharSequence constraint) { 
      constraint = constraint.toString(); 

      data.clear(); 
      if(constraint.length() == 0){ 
       data.addAll(original); 
      }else{ 
       for(classBidAttributes filts : original){ 
          if(filts.getTitle().contains(constraint) 
          || filts.getbidid().contains(constraint) 
          || filts.getbid_offer().contains(constraint) 
          || filts.getCategory().contains(constraint) 
          || filts.getDescription().contains(constraint) 
          || filts.getQuantity().contains(constraint) 
          || filts.getRepetitive_requests_yes().contains(constraint) 
          || filts.getRepetitive_requests_no().contains(constraint) 
          || filts.getExpiry_date().contains(constraint)){ 
         data.add(filts); 
        } 

       } 
      } 
      notifyDataSetChanged(); 
     }; 

不过这个片断是基于你的答案:)