如何使用搜索视图按字符而不是精确单词筛选列表视图



我有一个SearchView(v7(和Listview。一旦用户在 SearchView 中键入任何内容,就会生成结果,我会在列表视图中填充。所有工作,但问题是我必须准确地写出Listview中存在的单词

现在,我希望当用户从我们的 ListView 数据中键入任何匹配字符时,将显示匹配结果。

例如,当我键入字母I时,结果将如下所示。

1( 螨虫

2( 维迪

3( 拉维

4(拉维·

5( 图沙尔·普拉贾帕蒂

等。

大写和小写字母目前无关紧要。我怎样才能做到这一点?

试试这段代码:

 TextWatcher edtSearchTextTextWatcher = new TextWatcher() {
        public void afterTextChanged(Editable s) {
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String text = edtSearchText.getText().toString().trim();
            onSearchTextChanged(text);
        }
    };
    private void onSearchTextChanged(String text) {
        if (adapter!= null)
            adapter.filter(text);
    }

public void filter(final String text) {
        // Searching could be complex..so we will dispatch it to a different thread...
        new Thread(new Runnable() {
            @Override
            public void run() {
                // Clear the filter list
                filterList.clear();
                // If there is no search value, then add all original list items to filter list
                if (TextUtils.isEmpty(text)) {
                    filterList.addAll(inspectionsList);
                } else {
                    // Iterate in the original List and add it to filter list...
                    for (ClsInspection item : inspectionsList) {
                        if (item.getClientName().toLowerCase().contains(text.toLowerCase()) || item.getInspectorsName().toLowerCase().contains(text.toLowerCase())
                                || item.getAddesss().toLowerCase().contains(text.toLowerCase())) {
                            // Adding Matched items
                            filterList.add(item);
                        }
                    }
                }
                // Set on UI Thread
                (fragment.getActivity()).runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // Notify the List that the DataSet has changed...
                        notifyDataSetChanged();
                    }
                });
            }
        }).start();
    }

private List<String> inspectionsList = new ArrayList<>();
private List<String> filterList = new ArrayList<>();
public adapter( List<String> inspectionsList) {
        this.inspectionsList = inspectionsList;
        this.filterList.addAll(inspectionsList);
    }

首先你应该使用RecylerView而不是ListView。 在方法onQueryTextChange里面使用这个代码

            @Override
            public boolean onQueryTextChange(String newText) {
                newText = newText.toLowerCase() ;
                List<String> searchnames = new ArrayList<>() ;
                for(int i = 0 ; i < names.length ; i++){
                    String name = names[i].toLowerCase() ;
                    if(name.contains(newText)){
                        searchnames.add(name) ;
                    }
                }
                sampleRecylerAdapter.setFilter(searchnames);
                return true;
            }

这里,names是带有字符串集合的数组。 sampleRecylerAdapter.setFilter(searchnames);这里setFilter((是RecylerViewAdapter类的方法。

以下是RecylerviewAdapter的所有代码:

public class SampleRecylerAdapter extends RecyclerView.Adapter<SampleRecylerAdapter.SampleRecylerViewHolder> {
    private final LayoutInflater inflater;
    private Context context ;
    private  List<String> name = Collections.emptyList() ;

    public SampleRecylerAdapter(Context context, List<String> name){
        this.context = context ;
        this.name = name ;
        inflater = LayoutInflater.from(context) ;
    }
    @Override
    public SampleRecylerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_names, parent, false) ;
        SampleRecylerViewHolder sampleRecylerViewHolder = new SampleRecylerViewHolder(view);
        return sampleRecylerViewHolder;
    }
    @Override
    public void onBindViewHolder(SampleRecylerViewHolder holder, int position) {
        holder.textView.setText(name.get(position));
    }
    @Override
    public int getItemCount() {
        return name.size();
    }
    public class SampleRecylerViewHolder extends RecyclerView.ViewHolder{
        TextView textView ;
        public SampleRecylerViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.mynames) ;
        }
    }
    public void setFilter(List<String> mynames){
        name = new ArrayList<>() ;
        name.addAll(mynames) ;
        notifyDataSetChanged();
    }
}

尝试以这种方式使用您的代码。 我希望它可以帮助您解决问题。 如果您有任何问题,请告诉我。

适用于

我在这种情况下使用过编辑文本的任何文本侦听器

messageBoxView.alertdialog_edittext.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
            //adapter.getFilter().filter(s) ;
            val sr = s.toString().toLowerCase(Locale.ROOT)
            val newList: ArrayList<String> = ArrayList()
            //listItems is current list<String> inside adapter before searching
            for (list_item in listItems){
                val nocaps_item = list_item?.toLowerCase(Locale.ROOT)
                if(nocaps_item?.contains(sr)!!){
                    newList.add(list_item)
                }
            }
            val adapterNew: ArrayAdapter<String?> = ArrayAdapter(
                requireContext(),
                android.R.layout.simple_list_item_single_choice,
                newList as List<String?>
            )
            messageBoxView.alertdialog_Listview.adapter = adapterNew
        }
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        }
    })

最新更新