2016-12-21 41 views
0

我正在实现一个筛选器到我的自定义对象列表。过滤器正在工作,但如果我过滤列表,我会得到过滤的结果列表,如果我尝试用不同的词过滤列表似乎是空的。过滤器自定义对象列表,原始列表搜索后消失

过滤时看不到原始列表。

适配器:

public class ItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable{ 
    static final int LOAD_ORDERITEMS = 0; 
    private Context context; 
    private List<OrderItem> list; 

    private AddOrderFragment addOrderFragment; 

    public ItemsAdapter(Context context, List<OrderItem> list) { 
     this.context = context; 
     this.list = list; 
     this.addOrderFragment = addOrderFragment; 
    } 

    @Override 
    public int getItemViewType(int position) { 

     Object obj = list.get(position); 

     if (obj instanceof OrderItem) return LOAD_ORDERITEMS; 

     return super.getItemViewType(position); 
    } 


    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     int viewType = holder.getItemViewType(); 
     switch (viewType) { 

      case LOAD_ORDERITEMS: 
       LoadOrderItemsHolder loadOrderItemsHolder = (LoadOrderItemsHolder) holder; 

       retrieveAllOrderItem(loadOrderItemsHolder,position); 

       break; 
     } 

    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) { 
     RecyclerView.ViewHolder viewHolder = null; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     switch (viewType) { 
      case LOAD_ORDERITEMS: 
       View v_image_msg = inflater.inflate(R.layout.item_layout, parent, false); 
       viewHolder = new LoadOrderItemsHolder(v_image_msg); 
       break; 
     } 

     return viewHolder; 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    public void retrieveAllOrderItem(final LoadOrderItemsHolder holder, int position) { 

     final OrderItem data = (OrderItem) list.get(position); 

     holder.txtItemName.setText(data.getItemName()); 

     String unit = data.getQuantity() + " " + data.getUnit(); 
     holder.txtItemQty.setText(unit); 

     holder.relativeRow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       ((SearchActivity)context).linearLayoutRecycleView.setVisibility(View.GONE); 
       ((SearchActivity)context).textInput_Item_Unit.setVisibility(View.VISIBLE); 
       ((SearchActivity)context).textInput_Item_quantity.setVisibility(View.VISIBLE); 

       ((SearchActivity)context).textInput_Item_name.setBackgroundResource(0); 
       ((SearchActivity)context).edt_Item_Name.setText(data.getItemName()); 
       ((SearchActivity)context).edt_Item_quantity.setText(data.getQuantity()); 
       ((SearchActivity)context).edt_Item_Unit.setText(data.getUnit()); 

      } 
     }); 

    } 
    public Filter getFilter() { 
     return new Filter() { 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       final FilterResults oReturn = new FilterResults(); 
       final ArrayList<OrderItem> results = new ArrayList<OrderItem>(); 

       if (constraint != null) { 
        if (list != null && list.size() > 0) { 
         for (final OrderItem g : list) { 
          if (g.getItemName().toLowerCase() 
            .contains(constraint.toString())) 
           results.add(g); 
         } 
        } 
        oReturn.values = results; 
       } 
       return oReturn; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, 
              FilterResults results) { 
       list = (ArrayList<OrderItem>) results.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 
} 

请帮助..谢谢..

回答

1

使用此代码

static final int LOAD_ORDERITEMS = 0; 
private Context context; 
private List<OrderItem> list; 
private List<OrderItem> baselist = new ArrayList<>(); 
private AddOrderFragment addOrderFragment; 

public ItemsAdapter(Context context, List<OrderItem> list) { 
    this.context = context; 
    this.list = list; 
    this.baselist = list; 
    this.addOrderFragment = addOrderFragment; 
} 

而在过滤

public Filter getFilter() { 
     return new Filter() { 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       final FilterResults oReturn = new FilterResults(); 
       final ArrayList<OrderItem> results = new ArrayList<OrderItem>(); 

       if (constraint != null) { 
        if (baselist != null && baselist.size() > 0) { 
         for (final OrderItem g : baselist) { 
          if (g.getItemName().toLowerCase() 
            .contains(constraint.toString())) 
           results.add(g); 
         } 
        } 
        oReturn.values = results; 
       } 
       return oReturn; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, 
              FilterResults results) { 
       list = (ArrayList<OrderItem>) results.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 

因为我们需要将原始列表存储在单独的数组列表中,我们需要从中获取过滤器数据。

+0

还没有得到原始列表。 – Sid

+0

@Sid,编辑过的代码,请再试一次 –

+0

是的,我试过编辑好的代码。 – Sid