2016-12-21 1 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

관련 문제