//下面的是使用的系统item布局完成的搜索功能:
//第一步 我的Activity布局,一个SearchView,一个ListView:
<?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
android:queryHint="搜索"
android:iconifiedByDefault="false"
android:background="@color/f2eeee"
android:id="@+id/mSearchView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- 为SearchView定义自动补齐的ListView-->
<ListView
android:id="@+id/mListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
//第二步 在Activity里使用:
// 数据的列表
private final String[] mStrings = { "张三", "李四", "王五", "赵六" };
//适配器
//自定义ArrayAdapter布局,第一个参数this上下文,第二个参数是引用自定义的布局,
// 第三个参数是自定义布局里的TextView的iD,代表用这个ID来适配第四个参数的数据,并且以这个ID的值搜索,
// 第四个参数是数组的数据
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_layout,R.id.mText,mStrings);
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, mStrings);
mListView.setAdapter(adapter);
//设置lv可以被过虑
mListView.setTextFilterEnabled(true);
// 设置该SearchView默认是否自动缩小为图标
// mSearchView.setIconifiedByDefault(false);
// 为该SearchView组件设置事件监听器
mSearchView.setOnQueryTextListener(this);
// 设置该SearchView显示搜索按钮
// mSearchView.setSubmitButtonEnabled(true);
//两个重要方法+去除黑框:
// 用户输入字符时激发该方法
@Override
public boolean onQueryTextChange(String newText) {
Toast.makeText(getContext(), "textChange--->" + newText, Toast.LENGTH_SHORT).show();
if (TextUtils.isEmpty(newText)) {
// 清除ListView的过滤
mListView.clearTextFilter();
} else {
// 使用用户输入的内容对ListView的列表项进行过滤
mListView.setFilterText(newText);
//隐藏弹出的黑框
mListView.dispatchDisplayHint(View.INVISIBLE);
}
return true;
}
// 单击搜索按钮时激发该方法
@Override
public boolean onQueryTextSubmit(String query) {
// 实际应用中应该在该方法内执行实际查询
// 此处仅使用Toast显示用户输入的查询内容
//输入完成后,点击搜索按钮或者软键盘的搜索按钮,就会触发这个
//Toast.makeText(getContext(), "您的选择是:" + query, Toast.LENGTH_SHORT).show();
//以下两个for循环是查看数组里有没有这条搜索的数据
for (int i = 0; i <mStrings.length ; i++) {
if (query.equals(mStrings[i])){
Toast.makeText(MainActivity.this, "有这个"+query, Toast.LENGTH_SHORT).show();
return false;
}
}
for (int i = 0; i <mStrings.length ; i++) {
if (!query.equals(mStrings[i])){
Toast.makeText(MainActivity.this, "没有这个"+query, Toast.LENGTH_SHORT).show();
return false;
}
}
return false;
}
//下面的是使用自定义布局完成的搜索功能:
//第一步 我的Activity布局:
<?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
android:queryHint="搜索"
android:iconifiedByDefault="false"
android:background="#cac5c5"
android:id="@+id/mSearchView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- 为SearchView定义自动补齐的ListView-->
<ListView
android:id="@+id/mListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
//第二步 我的Activity代码实现,都在Activity里完成:
public class MainActivity extends Activity {
private List<User> mData = new ArrayList<User>(); // 这个数据会改变
private List<User> mBackData; // 这是原始的数据
private ListView mListView;
private SearchView mSearchView;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) super.findViewById(R.id.mListView);
mSearchView = (SearchView) super.findViewById(R.id.mSearchView);
//添加数据
initData();
// 设置监听器
mSearchView.setOnQueryTextListener(new QueryListener());
mListView.setTextFilterEnabled(true);
mListView.setOnItemClickListener(new ItemClick());
//适配器
mAdapter = new MyAdapter();
mListView.setAdapter(mAdapter);
}
//我这里写的是死数据,也可以用User这个Bean类动态添加数据
private void initData() {
mData.add(new User(R.mipmap.aa,"张三"));
mData.add(new User(R.mipmap.bb,"李四"));
mData.add(new User(R.mipmap.ic_launcher,"王五"));
mData.add(new User(R.mipmap.ic_launcher_round,"赵六"));
//mBackData用来搜索框清空后回复到原始的数据
mBackData = mData;
}
// 必须实现Filterable接口
private class MyAdapter extends BaseAdapter implements Filterable {
private MyFilter mFilter;
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
convertView = View.inflate(MainActivity.this, R.layout.item_layout, null);
}
TextView textView = (TextView) convertView.findViewById(R.id.mText);
ImageView mImg = (ImageView) convertView.findViewById(R.id.mImg);
textView.setText(mData.get(position).getName());
mImg.setImageResource(mData.get(position).getImg());
return convertView;
}
@Override
public Filter getFilter() {
if (null == mFilter) {
mFilter = new MyFilter();
}
return mFilter;
}
// 自定义Filter类
class MyFilter extends Filter {
@Override
// 该方法在子线程中执行
// 自定义过滤规则
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<User> newValues = new ArrayList<User>();
String filterString = constraint.toString().trim().toLowerCase();
// 如果搜索框内容为空,就恢复原始数据
if (TextUtils.isEmpty(filterString)) {
newValues = mBackData;
} else {
// 过滤出新数据
for (int i = 0; i <mBackData.size() ; i++) {
//通过这个判断进行过滤,通过mBackData.get(i).getName()进行过滤
if (-1 != mBackData.get(i).getName().toLowerCase().indexOf(filterString)) {
newValues.add(mBackData.get(i));
}
}
}
results.values = newValues;
results.count = newValues.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mData = (List<User>) results.values;
if (results.count > 0) {
mAdapter.notifyDataSetChanged(); // 通知数据发生了改变
} else {
mAdapter.notifyDataSetInvalidated(); // 通知数据失效
}
}
}
}
// 搜索文本监听器
private class QueryListener implements SearchView.OnQueryTextListener {
// 当内容被提交时执行
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
// 当搜索框内内容发生改变时执行
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
mListView.clearTextFilter(); // 清楚ListView的过滤
} else {
mListView.setFilterText(newText); // 设置ListView的过滤关键词
//隐藏弹出的黑框
mListView.dispatchDisplayHint(View.INVISIBLE);
}
return true;
}
}
//ListView的item点击事件
private class ItemClick implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, mData.get(position).getName(), Toast.LENGTH_SHORT).show();
}
}
}
//第三步 我的自定义item布局item_layout.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="horizontal"
>
<ImageView
android:id="@+id/mImg"
android:src="@mipmap/ic_launcher"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/mText"
android:gravity="center"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="100dp" />
<TextView
android:text="年龄18"
android:gravity="center"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="100dp" />
<TextView
android:text="性别男"
android:gravity="center"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="100dp" />
<TextView
android:text="北京"
android:gravity="center"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="100dp" />
</LinearLayout>
//最后第四步 User这个bean类:
public class User {
private int img;
private String name;
public User(int img, String name) {
this.img = img;
this.name = name;
}
public int getImg() {
return img;
}
public void setImg(int img) {
this.img = img;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//设置SearchView字体大小,字体颜色。
if(mSearch==null){ return; }else{ //获取ImageView的id int imgId = mSearch.getContext().getResources().getIdentifier("android:id/search_mag_icon",null,null); //获取ImageView ImageView searchButton = (ImageView)mSearch.findViewById(imgId); //设置图片 searchButton.setImageResource(R.drawable.search); //不使用默认 mSearch.setIconifiedByDefault(false); }
//———————————————————————完————————————————————————
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118307.html