SearchView 不过滤项目

SearchView doesn´t filter items

不幸的是,我的 SeachView 不起作用。 Android Studio 中没有显示任何错误,我的应用程序运行没有任何问题。我的问题是,当我在 SearchView 中输入内容时,什么也没有发生。 Recyclerview 仍然显示我的数组列表中的所有项目并且不过滤它们。 感谢所有的回答:)

主要Activity:

public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private ArrayList<Mountain> list;
private SearchView searchView;
private ItemCardViewAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);

    list = new ArrayList<>();
    list.addAll(MountainData.getListData());

    showRecyclerViewList();

    mAdapter = new ItemCardViewAdapter(this);
    mAdapter.setListMountain(list);
    
    searchView = (SearchView) findViewById(R.id.searchView);
    searchView.setQueryHint("Search View");

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            mAdapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            mAdapter.getFilter().filter(query);
            return false;
        }
    });
    
}
private void showRecyclerViewList() {
    recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    ItemCardViewAdapter cardViewAdapter = new ItemCardViewAdapter(this);
    cardViewAdapter.setListMountain(list);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(cardViewAdapter);
}

适配器:

public class ItemCardViewAdapter extends RecyclerView.Adapter<ItemCardViewAdapter.CardViewHolder> implements Filterable {
private Context context;
private ArrayList<Mountain> listMountain;
private ArrayList<Mountain> filteredList = new ArrayList<>();

public ItemCardViewAdapter(MainActivity context) {
    this.context = context;
}



public ArrayList<Mountain> getListMountain() {
    return listMountain;
}

public void setListMountain(ArrayList<Mountain> listMountain) {
    this.listMountain = listMountain;
}

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

@Override
public void onBindViewHolder(@NonNull CardViewHolder holder, final int position) {
    holder.tvName.setText(getListMountain().get(position).getName());
    holder.tvDescription.setText(getListMountain().get(position).getDescription());
    Glide.with(context).load(getListMountain().get(position).getPhoto()).into(holder.imgPhoto);

    // intent parcel able to detail
    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent detailActivity = new Intent(context, DetailActivity.class);
            detailActivity.putExtra(DetailActivity.EXTRA_MOUNTAIN, listMountain.get(position));
            context.startActivity(detailActivity);
        }
    });
}

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

public class CardViewHolder extends RecyclerView.ViewHolder {
    ImageView imgPhoto;
    TextView tvName, tvDescription;
    Button button;

    public CardViewHolder(@NonNull View itemView) {
        super(itemView);
        imgPhoto = itemView.findViewById(R.id.img_card);
        tvName = itemView.findViewById(R.id.tv_name_card);
        tvDescription = itemView.findViewById(R.id.tv_desc_card);
        button = itemView.findViewById(R.id.button);
    }
}

@Override
public Filter getFilter(){
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if(charString.isEmpty()){
                filteredList = listMountain;
            }
            else
            {
                ArrayList<Mountain> MountainFilteredList = new ArrayList<>();
                for(Mountain item : listMountain){
                    if(item.getName().toLowerCase().contains(charString.toLowerCase())) {
                        MountainFilteredList.add(item);
                    }
                }
                filteredList = MountainFilteredList;
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;
            return filterResults;
        }

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

        }
    };
}

型号:

public class Mountain implements Parcelable {

// create implementation Parcelable to this class
private String name, elevation, photo, description, location;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getElevation() {
    return elevation;
}

public void setElevation(String elevation) {
    this.elevation = elevation;
}

public String getPhoto() {
    return photo;
}

public void setPhoto(String photo) {
    this.photo = photo;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}

public Mountain() {
}

protected Mountain(Parcel in) {
    name = in.readString();
    elevation = in.readString();
    photo = in.readString();
    description = in.readString();
    location = in.readString();
}

public static final Creator<Mountain> CREATOR = new Creator<Mountain>() {
    @Override
    public Mountain createFromParcel(Parcel in) {
        return new Mountain(in);
    }

    @Override
    public Mountain[] newArray(int size) {
        return new Mountain[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(name);
    parcel.writeString(elevation);
    parcel.writeString(photo);
    parcel.writeString(description);
    parcel.writeString(location);
}

1) 在 ItemCardViewAdapter() 构造函数中,您需要将 filteredList 传递到您的 listMountain列表。

public ItemCardViewAdapter(MainActivity context) {
      this.context = context;
      listMountain= new ArrayList<>();
      listMountain.addAll(filteredList);
}

2) 首先清除listMountain然后将filteredList加入listMountain publishResults() 方法中的列表。

  protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        listMountain.clear();
        listMountain.addAll((Collection<? extends Mountain>) filterResults.values;
        notifyDataSetChanged();

    }