Member 13053943 Ответов: 0

Как искать подстроку из двух разных строк в searchview


Я хочу найти две разные строки из разных столбцов в представлении поиска.Например, вместо "city state "я хочу найти" ci sta " и получить список полей, содержащих эти слова. спасибо

Что я уже пробовал:

public class ProviderRecyclerAdapter extends RecyclerView.Adapter<ProviderViewHolder> implements Filterable {

    private ArrayList<Provider_list> mDataset;
    private Context mContext;
    private ProviderFilter providerFilter;

    public ProviderRecyclerAdapter(ArrayList<Provider_list> dataset, Context context) {
        mDataset = dataset;
        mContext = context;
    }


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


    @Override
    public void onBindViewHolder(ProviderViewHolder holder, int position) {
        Provider_list n = mDataset.get(position);
        holder.mTitle.setText(n.getProvider_name());
        holder.mCity.setText(n.getCity());
        holder.mRegion.setText(n.getRegion());
        holder.mAddress.setText(n.getAddress());



    }

    @Override
    public ProviderViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.provider_layout, parent, false);
        return new ProviderViewHolder(view);
    }


    @Override
    public Filter getFilter() {
        if(providerFilter == null)
            providerFilter = new ProviderFilter(this, mDataset);
        return providerFilter;
    }

    private static class ProviderFilter extends Filter {

        private final ProviderRecyclerAdapter brandsAdapter;
        private final List<Provider_list> originalList;
        private final List<Provider_list> filteredList;

        private ProviderFilter(ProviderRecyclerAdapter brandsAdapter, List<Provider_list> originalList) {
            super();
            this.brandsAdapter = brandsAdapter;
            this.originalList = new LinkedList<>(originalList);
            this.filteredList = new ArrayList<>();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            filteredList.clear();
            final FilterResults results = new FilterResults();

            if (constraint.length() == 0) {
                filteredList.addAll(originalList);
            } else {
                final String filterPattern = constraint.toString().toLowerCase().trim();

                for (final Provider_list business : originalList) {
                    if (business.getProvider_name().toLowerCase().contains(filterPattern)) {
                        filteredList.add(business);
                    }
                    else if (business.getAddress().toLowerCase().contains(filterPattern)){
                        filteredList.add(business);
                    }
                    else if (business.getRegion().toLowerCase().contains(filterPattern)){
                        filteredList.add(business);
                    }
                    else if (business.getCity().toLowerCase().contains(filterPattern)){
                        filteredList.add(business);
                    }
                    else if ( business.getCity().toLowerCase().contains(filterPattern) && business.getProvider_name().toLowerCase().contains(filterPattern) )
                    {
                        filteredList.add(business);
                    }


                }
            }
            results.values = filteredList;
            results.count = filteredList.size();
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            brandsAdapter.mDataset.clear();
            brandsAdapter.mDataset.addAll((List<Provider_list>) results.values);
            brandsAdapter.notifyDataSetChanged();
        }
    }
}

David Crow

Так в чем же проблема? Подсказка: "это не работает" - это неправильный ответ.

Member 13053943

вы вообще читали вопрос? я хочу найти две неполные разные строки в строке поиска.когда я набираю пробел и другое слово, поиск не работает

David Crow

Да, я прочитал вопрос. Однако вы не упомянули, в чем проблема. В любом случае вам нужно будет изменить performFiltering(). Возьмите ограничение и разбейте его на подстроки (разделенные пробелом). Для каждой найденной подстроки найдите соответствующие поля в Provider_list.

Member 13053943

с кодом проблем нет.мне трудно делать тот тип поиска, который я хочу.как и при поиске "ci st", у меня должен быть список данных, содержащих that.my проблема заключается в пространстве между строками, которое я не могу добавить в код.если вы можете записать для меня несколько кодов, я буду вам очень признателен.спасибо

0 Ответов