简体   繁体   中英

Recycler view multiple search

Currently i can search only one string word. example, I need to search for multiple words i type "nougat,donut" and they show me these two? What i need to put in code for this to work?

DataAdapter.java

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> implements Filterable {
private ArrayList<AndroidVersion> mArrayList;
private ArrayList<AndroidVersion> mFilteredList;

public DataAdapter(ArrayList<AndroidVersion> arrayList) {
    mArrayList = arrayList;
    mFilteredList = arrayList;
}

@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_name.setText(mFilteredList.get(i).getName());
    viewHolder.tv_version.setText(mFilteredList.get(i).getVer());
    viewHolder.tv_api_level.setText(mFilteredList.get(i).getApi());
}

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

@Override
public Filter getFilter() {

    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            String charString = charSequence.toString();

            if (charString.isEmpty()) {

                mFilteredList = mArrayList;
            } else {

                ArrayList<AndroidVersion> filteredList = new ArrayList<>();

                for (AndroidVersion androidVersion : mArrayList) {

                    if (androidVersion.getApi().toLowerCase().contains(charString) || androidVersion.getName().toLowerCase().contains(charString) || androidVersion.getVer().toLowerCase().contains(charString)) {

                        filteredList.add(androidVersion);
                    }
                }

                mFilteredList = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = mFilteredList;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            mFilteredList = (ArrayList<AndroidVersion>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_name,tv_version,tv_api_level;
    public ViewHolder(View view) {
        super(view);

        tv_name = (TextView)view.findViewById(R.id.tv_name);
        tv_version = (TextView)view.findViewById(R.id.tv_version);
        tv_api_level = (TextView)view.findViewById(R.id.tv_api_level);

    }
}

json recycler view

this is search but only for one word

you can try this

  if (charString.contains(",")) {
  String searchChar[] = charString.split(",");
  for (int i = 0; i < searchChar.length; i++) {

    if (androidVersion.getApi().toLowerCase().contains(searchChar[i]) || androidVersion
        .getName()
        .toLowerCase().contains(searchChar[i]) || androidVersion.getVer().toLowerCase()
        .contains(searchChar[i])) {

      filteredList.add(androidVersion);
    }
  }
} else {
  if (androidVersion.getApi().toLowerCase().contains(charString) || androidVersion.getName()
      .toLowerCase().contains(charString) || androidVersion.getVer().toLowerCase()
      .contains(charString)) {

    filteredList.add(androidVersion);
  }
}

replace the code :

   if (androidVersion.getApi().toLowerCase().contains(charString) ||
    androidVersion.getName().toLowerCase().contains(charString) ||
    androidVersion.getVer().toLowerCase().contains(charString)) {

    filteredList.add(androidVersion);
   }

You need to add some pre-processing to determine if there are multiple values

 @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
        String splitter = ",";
        final String[] multipleValues = charSequence.toString().split(splitter);
        //your null check
        List<AndroidVersions> filteredList = new ArrayList()
        for (String value : multipleValues) {
            filteredList.addAll(internalFilter(mArrayList, value));
        }
        //the rest of your code
    }

    private List<AndroidVersions> internalFilter(ArrayList<AndroidVersions> listToFilter, String value) {
        List<AndroidVersions> filteredList = new ArrayList()
        for (AndroidVersion androidVersion : listToFilter) {
            if (androidVersion.getApi().toLowerCase().contains(value)
                || androidVersion.getName().toLowerCase().contains(value)
                || androidVersion.getVer().toLowerCase().contains(value)) {

                filteredList.add(androidVersion);
            }
        }
        return filteredList;
    }

This code will also work perfectly fine with only 1 value

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM