如何在android中的简单列表视图上使用startsWith应用搜索过滤器

Posted

技术标签:

【中文标题】如何在android中的简单列表视图上使用startsWith应用搜索过滤器【英文标题】:How to apply search filter using startsWith on a simple listview in android 【发布时间】:2021-09-03 02:37:56 【问题描述】:

我有一个从数据库获取数据的ListView。我对其应用了搜索过滤器,但它没有按我的意愿过滤。我想要的是过滤 首字母 不是中间或包含。

代码如下:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener 

    ListView dicList; 
    EditText editSearch;
    ArrayAdapter<String> adapterListOfWord;
    ArrayList<String> mSource = new ArrayList<String>();

    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editSearch = findViewById(R.id.edit_search);
        dicList = findViewById(R.id.dic_list);

        adapterListOfWord = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mSource);
        dicList.setAdapter(adapterListOfWord);

        editSearch.addTextChangedListener(new TextWatcher() 
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) 

            

            @Override
            public void onTextChanged(CharSequence charSequence, int start, int before, int count) 
                // the problem is here, i want to search with the first letter not middle or contains.
                adapterListOfWord.getFilter().filter(charSequence);
            

            @Override
            public void afterTextChanged(Editable s) 

            
        );
    

我不知道如何根据我的代码实施过滤器并将其应用于我的项目并将contains()更改为startsWith()以达到我的目标。 非常感谢您的帮助。 提前致谢。

【问题讨论】:

【参考方案1】:

您需要使用自定义适配器而不是默认适配器,并覆盖 getFilter() 以使用 String 的 startsWith() 方法过滤列表:

适配器:

public class StartsWithArrayAdapter extends ArrayAdapter<String> implements Filterable 

    private final List<String> mList = new ArrayList<>();
    private List<String> mFilteredList = new ArrayList<>();

    public StartsWithArrayAdapter(Context context, int textViewResourceId, ArrayList<String> list) 
        super(context, textViewResourceId, list);
        this.mList.addAll(list);
        this.mFilteredList.addAll(list);
    

    @Override
    public int getCount() 
        return mFilteredList.size();
    

    @NonNull
    @Override
    public Filter getFilter() 
        return new Filter() 
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) 
                String charString = charSequence.toString();
                if (charString.isEmpty()) 
                    mFilteredList = mList;
                 else 
                    List<String> filteredList = new ArrayList<>();
                    for (String listItem : mList) 
                        if (listItem.toLowerCase().startsWith(charString.toLowerCase())) 
                            filteredList.add(listItem);
                        
                    
                    mFilteredList = filteredList;
                

                FilterResults filterResults = new FilterResults();
                filterResults.values = mFilteredList;
                return filterResults;
            

            @Override
            @SuppressWarnings("unchecked")
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) 
                mFilteredList = (ArrayList<String>) filterResults.values;
                clear();
                addAll(mFilteredList);
                notifyDataSetChanged();
            
        ;

    
    

在您的代码中的用法:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener 


    StartsWithArrayAdapter adapterListOfWord;
    
    // rest of code

    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // omitted code
        
        adapterListOfWord = new StartsWithArrayAdapter(this, android.R.layout.simple_list_item_1, mSource);
        
        // rest of code

    

【讨论】:

以上是关于如何在android中的简单列表视图上使用startsWith应用搜索过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何从列表视图中的项目单击中获取歌曲在android中

使用 Phonegap 将字母滚动条添加到 Android 应用程序中的列表视图

如何从android的listview中的不同项目获取数据

从 Android 上的 URL 简单解析 JSON 并显示在列表视图中

Android - 网格视图或列表视图?

滑动手势不支持用手指在 android 的滑动抽屉中的列表视图上