Gridview筛选器在android中不起作用
您好,下面的代码实现了搜索功能。Gridview用于显示网格布局。我的网格布局工作正常。在该网格中,我按名称搜索,但它不工作 例如,我有三个名字,分别是cardiology、Ent、Ortho如果我正在搜索或键入ca意味着给我一个确切的心脏病学。如果键入o意味着再次向我显示心脏病学,结果应该是Ortho 谁能帮我一下我哪里出了错 布局:Gridview筛选器在android中不起作用,android,filter,Android,Filter,您好,下面的代码实现了搜索功能。Gridview用于显示网格布局。我的网格布局工作正常。在该网格中,我按名称搜索,但它不工作 例如,我有三个名字,分别是cardiology、Ent、Ortho如果我正在搜索或键入ca意味着给我一个确切的心脏病学。如果键入o意味着再次向我显示心脏病学,结果应该是Ortho 谁能帮我一下我哪里出了错 布局: <androidx.appcompat.widget.SearchView android:id="@
<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" />
适配器:
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);
}
公共类SpeclializationAdapter扩展BaseAdapter实现可过滤{
私有上下文;
私有ArrayList doctorListModels;
私人ArrayList completeList;
private SpeclializationAdapter.MyItemClickListener clickListener;
private doctor adapter.SelectIemClickListner SelectIemClickListner;
公共SpecializationAdapter(上下文上下文、ArrayList doctorListModels、MyItemClickListener clickListener){
mContext=上下文;
this.doctorListModels=doctorListModels;
this.clickListener=clickListener;
this.completeList=doctorListModels;
this.completeList=新的ArrayList();
this.completeList.addAll(doctorListModels);
}
@凌驾
public int getCount(){
返回doctorListModels.size();
}
@凌驾
公共对象getItem(int位置)
{
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)mContext
.getSystemService(上下文布局\充气机\服务);
视图gridView=null;
最终图像视图speclialistimage;
最终文本视图专门化;
最终线性布局规范清单;
if(convertView==null){
gridView=新视图(mContext);
convertView=充气机。充气(R.layout.speclialist,null);
speclialistimage=convertView.findViewById(R.id.specilistimage);
speclist=convertView.findviewbyd(R.id.speclist);
专门化=convertView.findViewById(R.id.specialization);
setText(doctorListModels.get(position.getSpecialization());
//specialization.setText(specListFiltered.get(position.getSpecialization());
最终字符串speciality_name=doctorListModels.get(position.getSpecialization();
if(特殊性名称等于(“心脏病学”)){
setImageResource(R.drawable.cardiology);
}
if(专业名称等于(“耳鼻喉科专家”)){
speclialistimage.setImageResource(R.drawable.neurology);
}
if(特殊性名称等于(“整形外科”)){
speclialistimage.setImageResource(R.drawable.Orthopedical);
}
最终视图finalGridView=gridView;
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
speclialistimage.setBackgroundResource(R.drawable.like_按钮);
clickListener.myItemClick(位置);
}
});
}
返回视图;
}
@凌驾
公共过滤器getFilter(){
过滤器过滤器=新过滤器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
ArrayList searchResult=新建ArrayList();
if(constraint!=null&&constraint.length()>0){
constraint=constraint.toString().toUpperCase();
对于(int i=0;i
}你把参考资料搞砸了。现在,您的
ArrayList
即specialistListFiltered
和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)
}
PS您应该已经在使用
RecyclerView
而不是GridView
ListView
和GridView
现在都是旧式产品。应该可以使用。使用更新的答案并调试代码。如果我输入c表示列表为空,但我使用的是gridview,gridview列表是正确的,现在如果输入字母c,没有显示我的gridview,请看一看,我不会说这个问题在Android中不起作用hehe])数百万人使用它ok。
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)
}
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;
}