用SearchView和ListView写的一个可以实现模糊查找的搜索框demo

Posted 轻烟散入五侯家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用SearchView和ListView写的一个可以实现模糊查找的搜索框demo相关的知识,希望对你有一定的参考价值。

    一、第一部分
    ①首先,你的主活动MainActivity要这么写:

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener 

    ListView listView;
    private String[] mStrings = new String[]"1314", "6666", "6134", "1234";
    String[] str;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();

        //给listView初始装载数据
        listView = findViewById(R.id.listview);
        listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, mStrings));

        //设置ListView启用过滤
        listView.setTextFilterEnabled(true);
        SearchView searchView = findViewById(R.id.searchview);
        //设置该SearchView默认是否自动缩小为图标
        searchView.setIconifiedByDefault(false);
        //设置该SearchView显示搜索按钮
        searchView.setSubmitButtonEnabled(true);
        searchView.setQueryHint("查找");

        searchView.setOnQueryTextListener(this);
    

    //用户输入字符时激发该方法
    @Override
    public boolean onQueryTextChange(String newText) 
        //如果newText不是长度为0的字符串
        if (TextUtils.isEmpty(newText)) 
            //清除ListView的过滤
            listView.clearTextFilter();
         else 
            //使用用户输入的内容对ListView的列表项进行过滤
            listView.setFilterText(newText);
        
        return true;
    

    //单机搜索按钮时激发该方法
    @Override
    public boolean onQueryTextSubmit(String query) 
        //实际应用中应该在该方法内执行实际查询,此处仅使用Toast显示用户输入的查询内容
        Toast.makeText(MainActivity.this, "你的选择是:" + query, Toast.LENGTH_SHORT).show();
        return false;
    



    ②、主活动对应的布局activity_main.xml要这么写:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!--定义一个SearchView-->
    <SearchView
        android:id="@+id/searchview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <!--为SearchView定义自动完成的ListView-->
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
</LinearLayout>

    ③、这样就可以实现下面的效果:

    不过你可能会发现一个问题,就是此时搜索框输入内容时只能匹配开始的字符,譬如当你输入“1”的时候,字符"6134"却没有被筛选出来,这明显不符合我们的需求。下面进入第二个部分内容来解决这个问题。

    二、第二部分
   ①首先,你的主活动MainActivity更改成这样:

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener 

    ListView listView;
    private String[] mStrings = new String[]"1314", "6666", "6134", "1234";
    String[] str;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();

        //给listView初始装载数据
        listView = findViewById(R.id.listview);
        listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, mStrings));

        //设置ListView启用过滤
        listView.setTextFilterEnabled(true);
        SearchView searchView = findViewById(R.id.searchview);
        //设置该SearchView默认是否自动缩小为图标
        searchView.setIconifiedByDefault(false);
        //设置该SearchView显示搜索按钮
        searchView.setSubmitButtonEnabled(true);
        searchView.setQueryHint("查找");

        searchView.setOnQueryTextListener(this);
    

    //用户输入字符时激发该方法
    @Override
    public boolean onQueryTextChange(String newText) 
        //如果newText不是长度为0的字符串
        if (TextUtils.isEmpty(newText)) 
            //清除ListView的过滤
           // listView.clearTextFilter();
            listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1));//没有输入的时候就显示空

         else 
            //使用用户输入的内容对ListView的列表项进行过滤
            //listView.setFilterText(newText);

            //下面这段代码就是我自己写了一个筛选的逻辑,只要你输入的字符在mStrings里面的字符串里面有包含的话,筛选在listView显示出来,当然你可以自己写其它的筛选逻辑
            List<String> list = new ArrayList<String>();

            int length = mStrings.length;
            for(int i=0; i<length; i++)
                if(mStrings[i].contains( newText ))
                    list.add(mStrings[i]);
                
            

            String[] new_mStrings = list.toArray(new String[list.size()]);
            listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, new_mStrings));



        
        return true;
    

    //单机搜索按钮时激发该方法
    @Override
    public boolean onQueryTextSubmit(String query) 
        //实际应用中应该在该方法内执行实际查询,此处仅使用Toast显示用户输入的查询内容
        Toast.makeText(MainActivity.this, "你的选择是:" + query, Toast.LENGTH_SHORT).show();
        return false;
    



    其中有变化的内容只在onQueryTextChange方法里面,相关知识点我都有写注释。
    ②、主活动的xml布局跟第一部分里面的一样。
    ③、这样就可以实现下面这个效果:

    从上面可以看出,当我们输入“1”的时候,“6134”也显示出来了,说明我们的筛选效果达到了。
    三、第三部分。
    各位看官看得可还行。宣传下我自己独立开发的的android应用:
    首先是华为市场下载链接:华为应用市场_圆周率查生日app_下载详情界面
    就是下面这个应用。

以上是关于用SearchView和ListView写的一个可以实现模糊查找的搜索框demo的主要内容,如果未能解决你的问题,请参考以下文章

用SearchView和ListView写的一个可以实现模糊查找的搜索框demo

具有自定义适配器的 ListView 中的 SearchView

ListView 与 CoordinatorLayout 中的 SearchView 重叠

放置在 Listview 上时,Android Searchview 不会触发

搜索视图和可过滤:显示带有搜索文本的栏

在使用存储在 JSON 上的 ID 进行 SearchView 过滤后,如何从 ListView 打开 Activity