【问题标题】:Not getting proper results after performing search执行搜索后没有得到正确的结果
【发布时间】:2020-03-18 07:46:26
【问题描述】:

这是我的片段,类似于 MainActivity :

   public class cgpa_frag extends Fragment {

    RecyclerView recyclerview;
    adapter_cgpa ac;

    ArrayList<POJO> cgpaArrayList = new ArrayList<>();

    public cgpa_frag() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


setHasOptionsMenu(true);

        View view = inflater.inflate(R.layout.fragment_cgpa_frag, container, false);
        recyclerview = (RecyclerView) view.findViewById(R.id.rc2);
        cgpaArrayList = new ArrayList<>();
        ac = new adapter_cgpa(cgpaArrayList);
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
        recyclerview.setAdapter(ac);


        Fetchdata2();
        return view;
    }

    private void Fetchdata2() {
        dbmanager db = new dbmanager(getContext());

        Cursor cursor = db.fetch_data2();

        if (cursor != null) {

            // cursor.moveToFirst();
            while (cursor.moveToNext()) {

                POJO pj = new POJO();
                pj.setCname(cursor.getString(0));
                pj.setNo_of_sems(cursor.getString(1));
                pj.setCgpa(cursor.getString(2));
                pj.setPercentage(cursor.getString(3));
                pj.setSchemec(cursor.getString(4));
                cgpaArrayList.add(pj);
            }

            ac = new adapter_cgpa(cgpaArrayList);


        }

    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        inflater.inflate(R.menu.search_menu, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                ac.getFilter().filter(newText);
                return false;

            }
        });
    }
}

这是我的适配器类:

public class adapter_cgpa extends RecyclerView.Adapter<adapter_cgpa.Viewholder> implements Filterable {

    ArrayList<POJO> cgpaArrayList;
    ArrayList<POJO> cgpaArrayListcopy;

    public adapter_cgpa(ArrayList<POJO> cgpaArrayList) {
        this.cgpaArrayList = cgpaArrayList;
        cgpaArrayListcopy = new ArrayList<>(cgpaArrayList);
    }

    @NonNull
    @Override
    public adapter_cgpa.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View listitem = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_cgpa, parent, false);
        return new Viewholder(listitem);
    }

    @Override
    public void onBindViewHolder(@NonNull adapter_cgpa.Viewholder holder, int position) {
        POJO cgpa= cgpaArrayList.get(position);
        holder.cname.setText(cgpa.getCname());
        holder.no_of_sems.setText(cgpa.getNo_of_sems());
        holder.cgpa.setText(cgpa.getCgpa());
        holder.percentage.setText(cgpa.getPercentage());
        holder.schemec.setText(cgpa.getSchemec());
    }
    @Override
    public int getItemCount() {
        return cgpaArrayList.size();
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }

    private Filter exampleFilter = new Filter() {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<POJO>filteredList=new ArrayList<>();

            if(constraint==null || constraint.length()==0){
                filteredList.addAll(cgpaArrayListcopy);
            }
            else {
                String filterPattern = constraint.toString().toLowerCase().trim();
                for( POJO item : cgpaArrayListcopy){
                    if (item.getCname().toLowerCase().contains(filterPattern)){
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results=new FilterResults();
            results.values=filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            cgpaArrayList.clear();
            cgpaArrayList.addAll((List)results.values);
            notifyDataSetChanged();
        }
    };

    public class Viewholder extends RecyclerView.ViewHolder {
        TextView cname, no_of_sems, cgpa, percentage,schemec;
        ImageButton btndelete2;
        public Viewholder(@NonNull View itemView) {
            super(itemView);
            cname=(TextView)itemView.findViewById(R.id.name);
            no_of_sems=(TextView)itemView.findViewById(R.id.no_of_sem);
            cgpa=(TextView)itemView.findViewById(R.id.textView49);
            percentage=(TextView)itemView.findViewById(R.id.textView55);
            schemec=(TextView)itemView.findViewById(R.id.scheme2);
            btndelete2=(ImageButton)itemView.findViewById(R.id.btndelete2);
            btndelete2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());
                    alert.setMessage("Are you sure you want to delete this?");

                            alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    });
                    alert.setPositiveButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    });
                    final AlertDialog dialogs  = alert.create();
                    dialogs.show();
                    dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            delete(getAdapterPosition());
                            dialogs.dismiss();

                        }
                    });
                    dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            dialogs.dismiss();
                        }
                    });

                }
            });
        }

        private void delete(int adapterPosition) {

            cgpaArrayList.remove(adapterPosition);
            notifyDataSetChanged();
            final String snc = cname.getText().toString();
            final String semrc = no_of_sems.getText().toString();
            final String schc = schemec.getText().toString();

            dbmanager db = new dbmanager(itemView.getContext());
            db.delete2(snc, semrc, schc);
        }
    }
}

这是 search_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/action_search"
        android:icon="@drawable/ic_search"
        android:title="Search by name..."
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.widget.SearchView" />

</menu>

无论我要搜索什么数据,我总是只获得第一个数据作为输出。

这是我的回收站视图:

这就是我搜索后得到的:

谁能告诉我哪里出错了?

我参考了这个视频: https://codinginflow.com/tutorials/android/searchview-recyclerview

【问题讨论】:

  • 你想使用搜索视图吗?
  • @MohammadMoeinGolchin 是的
  • 查看我链接到的页面
  • 你为什么将'result'定义为'FilterResults'?将其定义为 Arraylist 并向其中添加“filteredList.items”。我认为你应该用 'filteredList.items' 替换 'result'。

标签: android android-fragments android-recyclerview searchbar


【解决方案1】:

这不是一个正确的答案,但也许有帮助。这是一个远景,但我认为问题可能在于您在片段类中的一些奇怪的代码星座,主要是您实现 fetchdata2 的方式。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    setHasOptionsMenu(true);

    View view = inflater.inflate(R.layout.fragment_cgpa_frag, container, false);
    recyclerview = (RecyclerView) view.findViewById(R.id.rc2);
    cgpaArrayList = new ArrayList<>();
    //put this method here
    Fetchdata2();
    ac = new adapter_cgpa(cgpaArrayList);
    recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
    recyclerview.setAdapter(ac);



    return view;
}

private void Fetchdata2() {
    dbmanager db = new dbmanager(getContext());

    Cursor cursor = db.fetch_data2();

    if (cursor != null) {

        // cursor.moveToFirst();
        while (cursor.moveToNext()) {

            POJO pj = new POJO();
            pj.setCname(cursor.getString(0));
            pj.setNo_of_sems(cursor.getString(1));
            pj.setCgpa(cursor.getString(2));
            pj.setPercentage(cursor.getString(3));
            pj.setSchemec(cursor.getString(4));
            cgpaArrayList.add(pj);
        }

    }

}

我只是注意到你在光标内设置了很多次适配器,现在它只设置了一次。我仍然不确定这是否能解决您的问题,但请尝试一下。

现在 fetchdata2 仅填充 cgpaArraylist 并且在执行此方法后在不同的步骤中创建适配器

【讨论】:

  • 很高兴有帮助 ;)。有时问题恰恰出在你没注意的地方哈哈
  • 你能再帮我解决一个问题吗?
  • 确定,怎么了?
  • 在此代码中搜索时,如何在 recyclerview 中突出显示过滤后的文本?
  • 坦率地说,我以前从未这样做过,尽管它看起来很有用。这是一个类似的问题,似乎有一个被广泛接受的答案,显然你需要使用 spannable stackoverflow.com/questions/40256605/…
【解决方案2】:

在RecyclerView之前添加SearchView,配置一下

【讨论】:

【解决方案3】:
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;

import java.util.ArrayList;
import java.util.List;

public class adapter_cgpa extends RecyclerView.Adapter<adapter_cgpa.Viewholder> implements Filterable {

    ArrayList<POJO> cgpaArrayList;
    ArrayList<POJO> cgpaArrayListcopy;

    public adapter_cgpa(ArrayList<POJO> cgpaArrayList) {
        this.cgpaArrayList = cgpaArrayList;
        cgpaArrayListcopy = new ArrayList<>(cgpaArrayList);
    }

    @NonNull
    @Override
    public adapter_cgpa.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View listitem = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_cgpa, parent, false);
        return new Viewholder(listitem);
    }

    @Override
    public void onBindViewHolder(@NonNull adapter_cgpa.Viewholder holder, int position) {
        POJO cgpa = cgpaArrayList.get(position);
        holder.cname.setText(cgpa.getCname());
        holder.no_of_sems.setText(cgpa.getNo_of_sems());
        holder.cgpa.setText(cgpa.getCgpa());
        holder.percentage.setText(cgpa.getPercentage());
        holder.schemec.setText(cgpa.getSchemec());
    }

    @Override
    public int getItemCount() {
        return cgpaArrayList.size();
    }

    @Override
    public Filter getFilter() {
        return new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                List<POJO> filteredList = new ArrayList<>();


                if (TextUtils.isEmpty(constraint)) {
                    filteredList.addAll(cgpaArrayListcopy);
                } else {
                    String filterPattern = constraint.toString().toLowerCase().trim();
                    for (POJO item : cgpaArrayListcopy) {
                        if (item.getCname().toLowerCase().contains(filterPattern)) {
                            filteredList.add(item);
                        }else{
                            filteredList.remove(item);
                        }
                    }
                }

                FilterResults results = new FilterResults();
                results.values = filteredList;
                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                cgpaArrayList.clear();
                cgpaArrayList.addAll((List) results.values);
                notifyDataSetChanged();
            }
        };
    }

    public class Viewholder extends RecyclerView.ViewHolder {
        TextView cname, no_of_sems, cgpa, percentage, schemec;
        ImageButton btndelete2;

        public Viewholder(@NonNull View itemView) {
            super(itemView);
            cname = itemView.findViewById(R.id.name);
            no_of_sems = itemView.findViewById(R.id.no_of_sem);
            cgpa = itemView.findViewById(R.id.textView49);
            percentage = itemView.findViewById(R.id.textView55);
            schemec = itemView.findViewById(R.id.scheme2);
            btndelete2 = itemView.findViewById(R.id.btndelete2);
            btndelete2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());
                    alert.setMessage("Are you sure you want to delete this?");

                    alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    });
                    alert.setPositiveButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    });
                    final AlertDialog dialogs = alert.create();
                    dialogs.show();
                    dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            delete(getAdapterPosition());
                            dialogs.dismiss();

                        }
                    });
                    dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            dialogs.dismiss();
                        }
                    });

                }
            });
        }

        private void delete(int adapterPosition) {

            cgpaArrayList.remove(adapterPosition);
            notifyDataSetChanged();
            final String snc = cname.getText().toString();
            final String semrc = no_of_sems.getText().toString();
            final String schc = schemec.getText().toString();

            dbmanager db = new dbmanager(itemView.getContext());
            db.delete2(snc, semrc, schc);
        }
    }
}

【讨论】:

  • 这段代码显示的结果也和前面的代码一样。
  • 但是我给了你一个赞成票,因为你试过了......谢谢
  • 能否为每个搜索调试适配器过滤器,并检查列表大小。它可能会对你有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
相关资源
最近更新 更多