过滤自定义对象列表,原始列表在搜索后消失

时间:2016-12-21 06:13:58

标签: java android search arraylist filter

我正在为自定义对象列表实现过滤器。过滤器正在运行,但如果我过滤列表,我会得到过滤结果列表,如果我尝试使用不同的单词过滤,则列表似乎为空。

过滤后看不到原始列表。

适配器:

    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 个答案:

答案 0 :(得分: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();
            }
        };
    }

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