当搜索功能启动并更新适配器时,自定义 ListView 会删除列表项中除匹配搜索值之外的所有内容

when the search function starts and the adapter is updated the custom ListView removes every thing in the list item except the matching search value

Image 1 : before any search performed

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()”,但我不确定这里出了什么问题。

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

希望这就是这个问题所需的一切,如果你需要检查任何东西问我。

你猜对了。你在 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();
        }
    }

希望对您有所帮助:)

我终于设法让它正常工作,没有任何错误,结果是循环是问题的根源,最好避免正常的 for 循环,而是使用 foreach 循环,我不得不为搜索适配器从头开始重新编写整个代码,但如下所示:

         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();
       };

然而这个片段是基于你的回答 :)