java searchview_android搜索Android searchView和listview实现搜索

本文介绍了如何在Android应用中使用SearchView作为自定义标题栏的一部分,并结合ListView实现搜索功能。首先展示了自定义标题栏和主页布局的XML代码,然后在MainActivity.java中初始化SearchView并实现监听器。当用户输入查询时,通过修改ListView的适配器来显示匹配内容,实现了全文搜索。最后,文章提到了通过反射修改SearchView的背景和光标样式的方法。
摘要由CSDN通过智能技术生成

每日一贴,今天的内容关键字为android搜索

searchView是一个为用户提供输入搜索查询和提交请求给搜索提供者的用户界面部件,显示查询提议或结果列表!本篇介绍一下将searchView加入到自定义标题栏布局中,结合listview实现搜索,首先看一下自定义布局:

1.自定义标题栏布局:custom_action_bar_layout.xml

android:layout_width="match_parent"

android:layout_height="0dip"

android:background="#565758"

android:orientation="horizontal" >

android:id="@+id/search_view"

android:layout_width="0px"

android:layout_height="match_parent"

android:layout_weight="1"

android:iconifiedByDefault="false"

android:inputType="textFilter"

android:queryHint="@string/title_search_hint" >

2.主页布局:activity_main.xml :

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/list"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#969696" />

3. MainActivity.java

package com.example.searchview2;

import java.util.ArrayList;

import android.app.ActionBar;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.text.TextUtils;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup.LayoutParams;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.SearchView;

public class MainActivity extends Activity implements

SearchView.OnQueryTextListener {

ListView listView;

SearchView searchView;

Object[] names;

ArrayAdapter adapter;

ArrayList mAllList = new ArrayList();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initActionbar();

names = loadData();

listView = (ListView) findViewById(R.id.list);

listView.setAdapter(new ArrayAdapter(getApplicationContext(),

android.R.layout.simple_expandable_list_item_1, names));

listView.setTextFilterEnabled(true);

searchView.setOnQueryTextListener(this);

searchView.setSubmitButtonEnabled(false);

}

public void initActionbar() {

// 自定义标题栏

getActionBar().setDisplayShowHomeEnabled(false);

getActionBar().setDisplayShowTitleEnabled(false);

getActionBar().setDisplayShowCustomEnabled(true);

LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View mTitleView = mInflater.inflate(R.layout.custom_action_bar_layout,

null);

getActionBar().setCustomView(

mTitleView,

new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT,

LayoutParams.WRAP_CONTENT));

searchView = (SearchView) mTitleView.findViewById(R.id.search_view);

}

public Object[] loadData() {

mAllList.add("aa");

mAllList.add("ddfa");

mAllList.add("qw");

mAllList.add("sd");

mAllList.add("fd");

mAllList.add("cf");

mAllList.add("re");

return mAllList.toArray();

}

@Override

public boolean onQueryTextChange(String newText) {

if (TextUtils.isEmpty(newText)) {

// Clear the text filter.

listView.clearTextFilter();

} else {

// Sets the initial value for the text filter.

listView.setFilterText(newText.toString());

}

return false;

}

@Override

public boolean onQueryTextSubmit(String query) {

// TODO Auto-generated method stub

return false;

}

}

运行一下:

058e299302fff8e893d5ceea40f38103.png

99f6658348e289c8d3aeee63fe6a8ab0.png

以上字母匹配是通过listView的方法listView.setTextFilterEnabled(true);实现的,当真视察你会发现仅是匹配了首字母,而包含a的ddfa却没有显示出来,如何将包含输入的字符的所有项都显示出来呢?显然通过listView.setTextFilterEnabled(true);是不可能做到的,下面开始实现这个需求,通过稍微改革,通过从新刷新listview的适配器就能够实现了!!

每日一道理

整个世界,因为有了阳光,城市有了生机;细小心灵,因为有了阳光,内心有了舒畅。明媚的金黄色,树丛间小影成像在叶片上泛有的点点破碎似的金灿,海面上直射反映留有的随波浪层层翻滚的碎片,为这大自然创造了美景,惹人醉的温馨之感,浓浓暖意中夹杂着的明朗与柔情,让雨过天晴后久违阳光的心灵从新得到了滋润!

仅是修改了MainActivity.java文件:

package com.example.searchview2;

import java.lang.reflect.Field;

import java.util.ArrayList;

import android.app.ActionBar;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup.LayoutParams;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.SearchView;

public class MainActivity extends Activity implements

SearchView.OnQueryTextListener {

ListView listView;

SearchView searchView;

Object[] names;

ArrayAdapter adapter;

ArrayList mAllList = new ArrayList();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initActionbar();

names = loadData();

listView = (ListView) findViewById(R.id.list);

listView.setAdapter(new ArrayAdapter(getApplicationContext(),

android.R.layout.simple_expandable_list_item_1, names));

//listView.setTextFilterEnabled(true);

searchView.setOnQueryTextListener(this);

searchView.setSubmitButtonEnabled(false);

//SearchView去掉(修改)搜索框的背景 修改光标

//setSearchViewBackground(searchView);

}

public void initActionbar() {

// 自定义标题栏

getActionBar().setDisplayShowHomeEnabled(false);

getActionBar().setDisplayShowTitleEnabled(false);

getActionBar().setDisplayShowCustomEnabled(true);

LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View mTitleView = mInflater.inflate(R.layout.custom_action_bar_layout,

null);

getActionBar().setCustomView(

mTitleView,

new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT,

LayoutParams.WRAP_CONTENT));

searchView = (SearchView) mTitleView.findViewById(R.id.search_view);

}

public Object[] loadData() {

mAllList.add("aa");

mAllList.add("ddfa");

mAllList.add("qw");

mAllList.add("sd");

mAllList.add("fd");

mAllList.add("cf");

mAllList.add("re");

return mAllList.toArray();

}

@Override

public boolean onQueryTextChange(String newText) {

Object[] obj = searchItem(newText);

updateLayout(obj);

return false;

}

@Override

public boolean onQueryTextSubmit(String query) {

// TODO Auto-generated method stub

return false;

}

public Object[] searchItem(String name) {

ArrayList mSearchList = new ArrayList();

for (int i = 0; i < mAllList.size(); i++) {

int index = mAllList.get(i).indexOf(name);

// 存在匹配的数据

if (index != -1) {

mSearchList.add(mAllList.get(i));

}

}

return mSearchList.toArray();

}

public void updateLayout(Object[] obj) {

listView.setAdapter(new ArrayAdapter(getApplicationContext(),

android.R.layout.simple_expandable_list_item_1, obj));

}

// android4.0 SearchView去掉(修改)搜索框的背景 修改光标

public void setSearchViewBackground(SearchView searchView) {

try {

Class> argClass = searchView.getClass();

// 指定某个私有属性

Field ownField = argClass.getDeclaredField("mSearchPlate"); // 注意mSearchPlate的背景是stateListDrawable(不同状态不同的图片)

// 所以不能用BitmapDrawable

// setAccessible 它是用来设置是不是有权限拜访反射类中的私有属性的,只有设置为true时才可以拜访,默许为false

ownField.setAccessible(true);

View mView = (View) ownField.get(searchView);

mView.setBackgroundDrawable(getResources().getDrawable(

R.drawable.ic_menu_search));

// 指定某个私有属性

Field mQueryTextView = argClass.getDeclaredField("mQueryTextView");

mQueryTextView.setAccessible(true);

Class> mTextViewClass = mQueryTextView.get(searchView).getClass()

.getSuperclass().getSuperclass().getSuperclass();

// mCursorDrawableRes光标图片Id的属性

// 这个属性是TextView的属性,所以要用mQueryTextView(SearchAutoComplete)的父类(AutoCompleteTextView)的父

// 类( EditText)的父类(TextView)

Field mCursorDrawableRes = mTextViewClass

.getDeclaredField("mCursorDrawableRes");

// setAccessible 它是用来设置是不是有权限拜访反射类中的私有属性的,只有设置为true时才可以拜访,默许为false

mCursorDrawableRes.setAccessible(true);

mCursorDrawableRes.set(mQueryTextView.get(searchView),

R.drawable.ic_action_search);// 注意第一个参数持有这个属性(mQueryTextView)的对象(mSearchView)

// 光标必须是一张图片不能是颜色,因为光标有两张图片,一张是第一次获得核心的时候的闪烁的图片,一张是后边有内容时候的图片,如果用颜色填充的话,就会得到闪烁的那张图片,颜色填充的会收缩文字和光标的距离(某些字母会背光标覆盖一部分)。

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

运行一下:

d7f05298b6515bbc705f7e92f5784f3b.png

可以看出已经满足了自己的要求!!

下面代码中的:setSearchViewBackground(SearchView searchView)方法通过反射可以修改搜索框的背景和光标!!

文章结束给大家分享下程序员的一些笑话语录:

问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?

答:因为李艳红这种败类,所以我没女友!

---------------------------------

原创文章 By

android和搜索

---------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值