我想在片段中实现 recyclerview 的搜索栏。我在我的片段中尝试了以下代码,但它不起作用
I want to implement a searchbar for recycler view in a fragment. I have tried the below code in my fragment but it is not working
我已经在我的片段 class 中尝试了以下代码,但它没有工作,也没有显示任何错误,我已经提供了适配器 class 代码和片段 class代码请告诉我在哪里弄错了当我 运行 代码时它甚至没有显示片段上的搜索栏
//片段class代码
public class PharmacyPatientFragment extends Fragment {
PharmacyAdapter Adapter;
private FragmentPharmacyPatientBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentPharmacyPatientBinding.inflate(inflater);
binding.recylerviewPharmacy.setLayoutManager(new LinearLayoutManager(getContext()));
Adapter = new PharmacyAdapter(dataqueue());
binding.recylerviewPharmacy.setAdapter(Adapter);
return binding.getRoot();
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.search_option, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM);
super.onCreateOptionsMenu(menu, inflater);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
Adapter.getFilter().filter(s);
return false;
}
});
searchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
public ArrayList<PharmacyDataModel> dataqueue() {
ArrayList<PharmacyDataModel> holder = new ArrayList<>();
PharmacyDataModel obj1 = new PharmacyDataModel();
obj1.setMed_name("Remdesiver");
obj1.setMfg_change("HealthBio Pharmaceuticals");
obj1.setPrice_change("10000Rs.");
obj1.setQty_change("1 unit");
obj1.setImg_name(R.drawable.remdesiver);
holder.add(obj1);
PharmacyDataModel obj2 = new PharmacyDataModel();
obj2.setMed_name("PPE Kits");
obj2.setMfg_change("HealthBio Pharmaceuticals");
obj2.setPrice_change("800Rs.");
obj2.setQty_change("1 unit");
obj2.setImg_name(R.drawable.ppe);
holder.add(obj2);
PharmacyDataModel obj3 = new PharmacyDataModel();
obj3.setMed_name("Masks");
obj3.setMfg_change("HealthBio Pharmaceuticals");
obj3.setPrice_change("100Rs.");
obj3.setQty_change("1 unit");
obj3.setImg_name(R.drawable.masks);
holder.add(obj3);
PharmacyDataModel obj4 = new PharmacyDataModel();
obj4.setMed_name("Gloves");
obj4.setMfg_change("HealthBio Pharmaceuticals");
obj4.setPrice_change("50Rs.");
obj4.setQty_change("1 unit");
obj4.setImg_name(R.drawable.gloves);
holder.add(obj4);
PharmacyDataModel obj5 = new PharmacyDataModel();
obj5.setMed_name("Gluconate tablets");
obj5.setMfg_change("HealthBio Pharmaceuticals");
obj5.setPrice_change("100Rs.");
obj5.setQty_change("20 tablets");
obj5.setImg_name(R.drawable.gluconate);
holder.add(obj5);
PharmacyDataModel obj6 = new PharmacyDataModel();
obj6.setMed_name("Sugar Free");
obj6.setMfg_change("HealthBio Pharmaceuticals");
obj6.setPrice_change("250Rs.");
obj6.setQty_change("1 unit");
obj6.setImg_name(R.drawable.sugarfree);
holder.add(obj6);
PharmacyDataModel obj7 = new PharmacyDataModel();
obj7.setMed_name("Zincovit");
obj7.setMfg_change("HealthBio Pharmaceuticals");
obj7.setPrice_change("150Rs.");
obj7.setQty_change("1 unit");
obj7.setImg_name(R.drawable.zincovit);
holder.add(obj7);
return holder;
}
}
//适配器class代码
public class PharmacyAdapter extends RecyclerView.Adapter<PharmacyViewHolder> implements Filterable {
ArrayList<PharmacyDataModel> data;
ArrayList<PharmacyDataModel> datacopy;
private final Filter dataFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
ArrayList<PharmacyDataModel> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0) {
filteredList.addAll(datacopy);
} else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (PharmacyDataModel item : datacopy) {
if (item.getMed_name().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
data.clear();
data.addAll((ArrayList) filterResults.values);
notifyDataSetChanged();
}
};
public PharmacyAdapter(ArrayList<PharmacyDataModel> data) {
this.data = data;
datacopy = new ArrayList<>(data);
}
@NonNull
@Override
public PharmacyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.singlepharmacy_row, parent, false);
return new PharmacyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull PharmacyViewHolder holder, int position) {
holder.textMedName.setText(data.get(position).getMed_name());
holder.textMedQty.setText(data.get(position).getQty_change());
holder.textMedPrice.setText(data.get(position).getPrice_change());
holder.textMedMfg.setText(data.get(position).getMfg_change());
holder.imageMed.setImageResource(data.get(position).getImg_name());
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public Filter getFilter() {
return dataFilter;
}
}
您需要使用 str
将循环计数器转换为字符串,将值包含在列表中,使用乘法运算符重复列表中的值,然后使用字符串 join
插入空格的函数。这是一个例子。如果你想从 1 1 1
而不是像我在这里做的那样只是 1
开始,那么 print(' '.join((i + 2) * [str(i)]))
而不是显示的
>>> for i in range(1, 6):
... print(' '.join(i*[str(i)]))
...
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
我已经在我的片段 class 中尝试了以下代码,但它没有工作,也没有显示任何错误,我已经提供了适配器 class 代码和片段 class代码请告诉我在哪里弄错了当我 运行 代码时它甚至没有显示片段上的搜索栏
//片段class代码
public class PharmacyPatientFragment extends Fragment {
PharmacyAdapter Adapter;
private FragmentPharmacyPatientBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentPharmacyPatientBinding.inflate(inflater);
binding.recylerviewPharmacy.setLayoutManager(new LinearLayoutManager(getContext()));
Adapter = new PharmacyAdapter(dataqueue());
binding.recylerviewPharmacy.setAdapter(Adapter);
return binding.getRoot();
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.search_option, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM);
super.onCreateOptionsMenu(menu, inflater);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
Adapter.getFilter().filter(s);
return false;
}
});
searchView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
public ArrayList<PharmacyDataModel> dataqueue() {
ArrayList<PharmacyDataModel> holder = new ArrayList<>();
PharmacyDataModel obj1 = new PharmacyDataModel();
obj1.setMed_name("Remdesiver");
obj1.setMfg_change("HealthBio Pharmaceuticals");
obj1.setPrice_change("10000Rs.");
obj1.setQty_change("1 unit");
obj1.setImg_name(R.drawable.remdesiver);
holder.add(obj1);
PharmacyDataModel obj2 = new PharmacyDataModel();
obj2.setMed_name("PPE Kits");
obj2.setMfg_change("HealthBio Pharmaceuticals");
obj2.setPrice_change("800Rs.");
obj2.setQty_change("1 unit");
obj2.setImg_name(R.drawable.ppe);
holder.add(obj2);
PharmacyDataModel obj3 = new PharmacyDataModel();
obj3.setMed_name("Masks");
obj3.setMfg_change("HealthBio Pharmaceuticals");
obj3.setPrice_change("100Rs.");
obj3.setQty_change("1 unit");
obj3.setImg_name(R.drawable.masks);
holder.add(obj3);
PharmacyDataModel obj4 = new PharmacyDataModel();
obj4.setMed_name("Gloves");
obj4.setMfg_change("HealthBio Pharmaceuticals");
obj4.setPrice_change("50Rs.");
obj4.setQty_change("1 unit");
obj4.setImg_name(R.drawable.gloves);
holder.add(obj4);
PharmacyDataModel obj5 = new PharmacyDataModel();
obj5.setMed_name("Gluconate tablets");
obj5.setMfg_change("HealthBio Pharmaceuticals");
obj5.setPrice_change("100Rs.");
obj5.setQty_change("20 tablets");
obj5.setImg_name(R.drawable.gluconate);
holder.add(obj5);
PharmacyDataModel obj6 = new PharmacyDataModel();
obj6.setMed_name("Sugar Free");
obj6.setMfg_change("HealthBio Pharmaceuticals");
obj6.setPrice_change("250Rs.");
obj6.setQty_change("1 unit");
obj6.setImg_name(R.drawable.sugarfree);
holder.add(obj6);
PharmacyDataModel obj7 = new PharmacyDataModel();
obj7.setMed_name("Zincovit");
obj7.setMfg_change("HealthBio Pharmaceuticals");
obj7.setPrice_change("150Rs.");
obj7.setQty_change("1 unit");
obj7.setImg_name(R.drawable.zincovit);
holder.add(obj7);
return holder;
}
}
//适配器class代码
public class PharmacyAdapter extends RecyclerView.Adapter<PharmacyViewHolder> implements Filterable {
ArrayList<PharmacyDataModel> data;
ArrayList<PharmacyDataModel> datacopy;
private final Filter dataFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
ArrayList<PharmacyDataModel> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0) {
filteredList.addAll(datacopy);
} else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (PharmacyDataModel item : datacopy) {
if (item.getMed_name().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
data.clear();
data.addAll((ArrayList) filterResults.values);
notifyDataSetChanged();
}
};
public PharmacyAdapter(ArrayList<PharmacyDataModel> data) {
this.data = data;
datacopy = new ArrayList<>(data);
}
@NonNull
@Override
public PharmacyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.singlepharmacy_row, parent, false);
return new PharmacyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull PharmacyViewHolder holder, int position) {
holder.textMedName.setText(data.get(position).getMed_name());
holder.textMedQty.setText(data.get(position).getQty_change());
holder.textMedPrice.setText(data.get(position).getPrice_change());
holder.textMedMfg.setText(data.get(position).getMfg_change());
holder.imageMed.setImageResource(data.get(position).getImg_name());
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public Filter getFilter() {
return dataFilter;
}
}
您需要使用 str
将循环计数器转换为字符串,将值包含在列表中,使用乘法运算符重复列表中的值,然后使用字符串 join
插入空格的函数。这是一个例子。如果你想从 1 1 1
而不是像我在这里做的那样只是 1
开始,那么 print(' '.join((i + 2) * [str(i)]))
而不是显示的
>>> for i in range(1, 6):
... print(' '.join(i*[str(i)]))
...
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5