用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