【问题标题】:Filter custom object list, original list disappears after search过滤自定义对象列表,搜索后原始列表消失
【发布时间】:2017-05-06 11:50:36
【问题描述】:

我正在对我的自定义对象列表实施过滤器。过滤器正在工作,但是如果我过滤列表,我会得到过滤后的结果列表,如果我尝试用不同的词过滤,列表似乎是空的。

过滤后看不到原始列表。

适配器:

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

请帮忙..谢谢..

【问题讨论】:

    标签: java android search arraylist filter


    【解决方案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();
                }
            };
        }
    

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

    【讨论】:

    • 仍然没有得到原始列表。
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2019-12-24
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多