87.android 简单的SearchView搜索框+系统布局搜索框+自定义布局搜索+去除搜索时弹出的黑框

//下面的是使用的系统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);
}

//---------------------------------------------------------------------完------------------------------------------------------------------------

  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值