英文:
SearchView doesn´t filter items
问题
很遗憾,我的SeachView不起作用。在Android Studio中没有显示任何错误,我的应用程序也没有任何问题。我的问题是,当我在SearchView中输入内容时,没有任何反应。RecyclerView仍然显示来自我的ArrayList的所有项目,并且不对它们进行筛选。
主活动:
public class MainActivity extends AppCompatActivity {
// ... (其他代码)
@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 {
// ... (其他代码)
@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 {
// ... (其他代码)
}
英文:
Unfortunately, my SeachView does not work. No errors are shown in Android Studio and my app works without any problems. My problem is that when I enter something into the SearchView nothing happens. The Recyclerview still shows all items from my Array List and does not filter them.
Thanks for all the answers
Main 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);
}
Adapter:
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();
}
};
}
Model:
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
得分: 0
1) 在ItemCardViewAdapter()的构造函数中,你需要将filteredList传递给你的listMountain列表。
public ItemCardViewAdapter(MainActivity context) {
this.context = context;
listMountain = new ArrayList<>();
listMountain.addAll(filteredList);
}
2) 首先,在publishResults()方法中清除listMountain,然后将filteredList添加到listMountain列表中。
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
listMountain.clear();
listMountain.addAll((Collection<? extends Mountain>) filterResults.values);
notifyDataSetChanged();
}
英文:
1) In ItemCardViewAdapter() Constructor you need to pass filteredList into your listMountain list.
public ItemCardViewAdapter(MainActivity context) {
this.context = context;
listMountain= new ArrayList<>();
listMountain.addAll(filteredList);
}
2) firstly, clear listMountain and then add filteredList into listMountain list in publishResults() method.
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
listMountain.clear();
listMountain.addAll((Collection<? extends Mountain>) filterResults.values;
notifyDataSetChanged();
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论