android - Gridview过滤器在android中不起作用
问题描述
嗨,在下面的代码中实现搜索功能。Gridview 用于显示网格布局。我的网格布局工作正常。在那个网格中,我按名称搜索,但它不工作。
示例我有三个名称,分别命名为 heartology 、Ent 、Ortho 如果我正在搜索或输入 ca 表示给我确切的心脏病学。如果我输入 o 表示再次向我显示心脏病学结果应该是 Ortho
谁能帮我在哪里做错了
布局:
<androidx.appcompat.widget.SearchView
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:queryHint="Search By Speciality"
android:iconifiedByDefault="false"
app:searchHintIcon="@drawable/ic_baseline_search_24"
app:searchIcon="@drawable/ic_baseline_search_24"
android:textSize="18sp"
android:inputType="text"
app:closeIcon="@drawable/ic_baseline_close_24"
android:background="@drawable/rectangle_border"
android:textColor="@color/black" />
片段.java:
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
Log.d("TAG","new Text ==>"+newText);
speclializationAdapter.getFilter().filter(newText);
return true;
}
});
适配器:
public class SpeclializationAdapter extends BaseAdapter implements Filterable {
private Context mContext;
private ArrayList<DataList> doctorListModels;
private ArrayList<DataList> completeList;
private SpeclializationAdapter.MyItemClickListener clickListener;
private DoctorAdapter.SelectIemClickListner selectIemClickListner;
public SpeclializationAdapter(Context context, ArrayList<DataList> doctorListModels, MyItemClickListener clickListener){
mContext=context;
this.doctorListModels=doctorListModels;
this.clickListener=clickListener;
this.completeList=doctorListModels;
this.completeList = new ArrayList<DataList>();
this.completeList.addAll(doctorListModels);
}
@Override
public int getCount() {
return doctorListModels.size();
}
@Override
public Object getItem(int position)
{
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView = null;
final ImageView speclialistimage;
final TextView specialization;
final LinearLayout speclist;
if (convertView == null) {
gridView = new View(mContext);
convertView=inflater.inflate(R.layout.speclialist, null);
speclialistimage=convertView.findViewById(R.id.specilistimage);
speclist=convertView.findViewById(R.id.speclist);
specialization=convertView.findViewById(R.id.specialization);
specialization.setText(doctorListModels.get(position).getSpecialization());
// specialization.setText(speclistListFiltered.get(position).getSpecialization());
final String specliality_name=doctorListModels.get(position).getSpecialization();
if(specliality_name.equals("Cardiology")){
speclialistimage.setImageResource(R.drawable.cardiology);
}
if(specliality_name.equals("ENT specialist")){
speclialistimage.setImageResource(R.drawable.neurology);
}
if(specliality_name.equals("Orthopedics")){
speclialistimage.setImageResource(R.drawable.orthopedic);
}
final View finalGridView = gridView;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
speclialistimage.setBackgroundResource(R.drawable.like_button);
clickListener.myItemClick(position);
}
});
}
return convertView;
}
@Override
public Filter getFilter() {
Filter filter=new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults=new FilterResults();
ArrayList<DataList> searchResult = new ArrayList<DataList>();
if (constraint != null && constraint.length() > 0) {
constraint = constraint.toString().toUpperCase();
for (int i = 0; i < completeList.size(); i++) {
if (completeList.get(i).getSpecialization().toUpperCase().contains(constraint)) {
DataList d = new DataList(completeList.get(i).getSpecialization());
searchResult.add(d);
}
}
} else {
searchResult.addAll(completeList);
}
filterResults.count = searchResult.size();
filterResults.values = searchResult;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults filterResults) {
doctorListModels= (ArrayList<DataList>) filterResults.values;
notifyDataSetChanged();
}
};
return filter;
}
public interface MyItemClickListener{
void myItemClick(int position);
}
}
解决方案
你在参考上搞砸了。现在你的ArrayList
iespecialistListFiltered
和doctorListModels
指向同一个对象。因此,您对其中一个进行的任何修改都会影响两者。
其中一个列表应该包含所有项目,另一个应该包含过滤的项目,并且只有过滤的列表将与适配器一起使用。
private ArrayList<DataList> doctorListModels;
private ArrayList<DataList> completeList;
public SpeclializationAdapter(Context context, ArrayList<DataList> doctorListModels, MyItemClickListener clickListener){
mContext=context;
this.doctorListModels=doctorListModels;
this.clickListener=clickListener;
this.completeList = new ArrayList<DataList>();
this.completeList.addAll(doctorListModels)
}
如上所述,我已将名称更改completeList
为避免混淆。不是您将在过滤期间使用完整列表。
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults=new FilterResults();
ArrayList<DataList> searchResult = new ArrayList<DataList>();
if (constraint != null && constraint.length() > 0) {
constraint = constraint.toString().toUpperCase();
for (int i = 0; i < completeList.size(); i++) {
if (completeList.get(i).getSpecialization().toUpperCase().contains(constraint)) {
DataList d = new DataList(completeList.get(i).getSpecialization());
searchResult.add(d);
}
}
} else {
searchResult.addAll(completeList);
}
filterResults.count = searchResult.size();
filterResults.values = searchResult;
return filterResults;
}
PS你应该已经在使用RecyclerView
not GridView
。ListView
现在GridView
是遗产。
推荐阅读
- pandas - 从 Pandas 列创建具有相似日期的列表
- css - 网格布局隐藏的 CSS 溢出
- c# - 在 openpop net 中阅读电子邮件时收到错误“输入不是有效的 base64 字符串,因为它包含非 base 64 字符”
- java - 在 android gradle 项目中将 java 编译器标志添加到除协议缓冲区之外的所有内容
- php - 通过 packagist 打包一个 forked composer
- html - 将加载器与页面中心对齐并向其添加文本
- php - 如何在 postgresql 中保存二进制类型
- reactjs - 如何在使用reactjs单击复选框时禁用输入字段
- cmake - 等待 CMake 构建中的目标
- c++ - 从用户那里获取 N 个数字并找到最大的