首页 > 解决方案 > 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);


}

}

标签: androidfilter

解决方案


你在参考上搞砸了。现在你的ArrayListiespecialistListFiltereddoctorListModels指向同一个对象。因此,您对其中一个进行的任何修改都会影响两者。

其中一个列表应该包含所有项目,另一个应该包含过滤的项目,并且只有过滤的列表将与适配器一起使用。

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你应该已经在使用RecyclerViewnot GridViewListView现在GridView是遗产。


推荐阅读