精华内容
下载资源
问答
  • Android搜索功能的实现

    千次阅读 2017-06-09 15:33:59
    这里的搜索功能旨在解决本地数据搜索过滤,实现是EditText + ListView。 ListView用于展示数据, EditText用于接受输入内容,通过输入内容来过滤ListView中的数据并重新展示 过滤的实现用的是android.widget包

    原创文章,如有转载,请注明出处:http://blog.csdn.net/myth13141314/article/details/72961087


    这里的搜索功能旨在解决本地数据搜索过滤,实现是EditText + ListView。

    • ListView用于展示数据,
    • EditText用于接受输入内容,通过输入内容来过滤ListView中的数据并重新展示
    • 过滤的实现用的是android.widget包下的Filter类,以及Filterable接口

    具体实现

    • 首先介绍Filter的实现
    • 主要是复写performFiltering方法和publishResults方法
    • performFiltering方法主要是实现过滤的规则
    • publishResults方法主要是返回过滤后的结果以及更新数据
    • 这里的过滤规则很简单,就是用String的contains方法,包含过滤词的数据都会过滤出来,但是不能过滤拼音输入的过滤,这个需要利用第三方拼音库
    class MyFilter extends Filter {
            // 创建集合保存原始数据
            private List<String> original = new ArrayList<String>();
    
            public MyFilter(List<String> list) {
                this.original = list;
            }
    
            /**
             * 该方法返回搜索过滤后的数据
             */
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                // 创建FilterResults对象
                FilterResults results = new FilterResults();
    
                /**
                 * 没有搜索内容的话就还是给results赋值原始数据的值和大小
                 * 执行了搜索的话,根据搜索的规则过滤即可,最后把过滤后的数据的值和大小赋值给results
                 *
                 */
                if(TextUtils.isEmpty(constraint)){
                    results.values = original;
                    results.count = original.size();
                }else {
                    // 创建集合保存过滤后的数据
                    List<String> mList = new ArrayList<String>();
                    // 遍历原始数据集合,根据搜索的规则过滤数据
                    for(String s: original){
                        // 过滤规则的具体实现
                        if(s.trim().toLowerCase().contains(constraint.toString().trim().toLowerCase())){
                            // 规则匹配的话就往集合中添加该数据
                            mList.add(s);
                        }
                    }
                    results.values = mList;
                    results.count = mList.size();
                }
    
                return results;
            }
    
            /**
             * 该方法用来刷新用户界面,根据过滤后的数据重新展示列表
             */
            @Override
            protected void publishResults(CharSequence constraint,
                                          FilterResults results) {
                // 获取过滤后的数据
                list = (List<String>) results.values;
                // 如果接口对象不为空,那么调用接口中的方法获取过滤后的数据,具体的实现在new这个接口的时候重写的方法里执行
                if(listener != null){
                    listener.getFilterData(list);
                }
                // 刷新数据源显示
                notifyDataSetChanged();
            }
        }
    • ListView的Adapter修改
    public class ProjectAdapter extends BaseAdapter implements Filterable{
    
        private List<String> list;
        private Context context;
        private MyFilter filter = null;// 创建MyFilter对象
        private FilterListener listener;
    
        public ProjectAdapter(List<String> list, Context context, FilterListener listener) {
            this.list = list;
            this.context = context;
            this.listener = listener;
        }
    
        ...
    
        //Filterable接口的实现
        @Override
        public Filter getFilter() {
            // 如果MyFilter对象为空,那么重写创建一个
            if (filter == null) {
                filter = new MyFilter(list);
            }
            return filter;
        }
    
        ...
    
    }
    • FilterListener
    public interface FilterListener {
    
        void getFilterData(List<String> list);// 获取过滤后的数据
    
    }

    使用

    • 为ListView生成Adapter
    ProjectAdapter projectAdapter = new ProjectAdapter(names, getContext(), new FilterListener() {
        @Override
        public void getFilterData(List<String> list) {
            //对返回的过滤数据进行处理,这里的names肯定是变了
            //然后设置点击监听事件
            setOnItemClick(list);
        }
    });
    • EditText获取输入的过滤信息
    etSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (projectAdapter != null) {
                projectAdapter.getFilter().filter(s);
            }
        }
    
        @Override
        public void afterTextChanged(Editable s) {
    
        }
    });
    • 以上就是搜索功能的简单实现

    若要支持输入拼音进行过滤,可以使用第三方拼音库来处理拼音输入,然后过滤规则里增加对拼音的支持即可

    这里介绍下pinyin4j库的使用

    • 引入项目
    compile 'com.belerweb:pinyin4j:2.5.0'//获取汉字拼音
    
    • 编写一个拼音的处理工具类CN2SpellUtil
    public class CN2SpellUtil {
    
        public static StringBuffer sb = new StringBuffer();
    
        /**
         * 获取汉字字符串的首字母,英文字符不变
         * 例如:阿飞→af
         */
        public static String getPinYinHeadChar(String chines) {
            sb.setLength(0);
            char[] chars = chines.toCharArray();
            HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
            defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
            defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
            for (int i = 0; i < chars.length; i++) {
                if (chars[i] > 128) {
                    try {
                        sb.append(PinyinHelper.toHanyuPinyinStringArray(chars[i], defaultFormat)[0].charAt(0));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    sb.append(chars[i]);
                }
            }
            return sb.toString();
        }
    
        /**
         * 获取汉字字符串的第一个字母
         */
        public static String getPinYinFirstLetter(String str) {
            sb.setLength(0);
            char c = str.charAt(0);
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c);
            if (pinyinArray != null) {
                sb.append(pinyinArray[0].charAt(0));
            } else {
                sb.append(c);
            }
            return sb.toString();
        }
    
        /**
         * 获取汉字字符串的汉语拼音,英文字符不变
         */
        public static String getPinYin(String chines) {
            sb.setLength(0);
            char[] nameChar = chines.toCharArray();
            HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
            defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
            defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
            for (int i = 0; i < nameChar.length; i++) {
                if (nameChar[i] > 128) {
                    try {
                        sb.append(PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0]);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    sb.append(nameChar[i]);
                }
            }
            return sb.toString();
        }
    }
    
    • 然后在上面的Adapter的过滤规则里加上对拼音的支持
    // 过滤规则的具体实现
    if(s.trim().toLowerCase().contains(constraint.toString().trim().toLowerCase()) 
    || CN2SpellUtil.getPinYin(s).contains(constraint.toString().trim().toLowerCase())){
        // 规则匹配的话就往集合中添加该数据
        mList.add(s);
    }
    • OK,大功告成!


    欢迎关注我的公众号,和我一起每天进步一点点!
    这里写图片描述

    展开全文
  • Android搜索功能的案例,本地保存搜索历史记录

    万次阅读 多人点赞 2016-02-18 20:11:47
    同事负责开发的APP有一个搜索功能,并且需要显示搜索的历史记录,我闲暇之余帮她开发了这个功能,现把该页面抽取成一个demo分享给大家。实现效果如图所示: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使用...

    同事负责开发的APP有一个搜索功能,并且需要显示搜索的历史记录,我闲暇之余帮她开发了这个功能,现把该页面抽取成一个demo分享给大家。

    实现效果如图所示:
    这里写图片描述

    本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点:
    - 数据库的增删改查操作
    - ListView和ScrollView的嵌套冲突解决
    - 监听软键盘回车按钮设置为搜索按钮
    - 使用TextWatcher( )实时筛选
    - 已搜索的关键字再次搜索不重复添加到数据库
    - 刚进入页面设置软键盘不因为EditText而自动弹出


    代码

    1. RecordSQLiteOpenHelper.java
    package com.cwvs.microlife;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
    
        private static String name = "temp.db";
        private static Integer version = 1;
    
        public RecordSQLiteOpenHelper(Context context) {
            super(context, name, null, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
    
    }
    1. MainActivity.java
    package com.cwvs.microlife;
    
    import java.util.Date;
    
    import android.app.Activity;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.Window;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.CursorAdapter;
    import android.widget.EditText;
    import android.widget.SimpleCursorAdapter;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private EditText et_search;
        private TextView tv_tip;
        private MyListView listView;
        private TextView tv_clear;
        private RecordSQLiteOpenHelper helper = new RecordSQLiteOpenHelper(this);;
        private SQLiteDatabase db;
        private BaseAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            // 初始化控件
            initView();
    
            // 清空搜索历史
            tv_clear.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    deleteData();
                    queryData("");
                }
            });
    
            // 搜索框的键盘搜索键点击回调
            et_search.setOnKeyListener(new View.OnKeyListener() {// 输入完后按键盘上的搜索键
    
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {// 修改回车键功能
                        // 先隐藏键盘
                        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(
                                getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                        // 按完搜索键后将当前查询的关键字保存起来,如果该关键字已经存在就不执行保存
                        boolean hasData = hasData(et_search.getText().toString().trim());
                        if (!hasData) {
                            insertData(et_search.getText().toString().trim());
                            queryData("");
                        }
                        // TODO 根据输入的内容模糊查询商品,并跳转到另一个界面,由你自己去实现
                        Toast.makeText(MainActivity.this, "clicked!", Toast.LENGTH_SHORT).show();
    
                    }
                    return false;
                }
            });
    
            // 搜索框的文本变化实时监听
            et_search.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    if (s.toString().trim().length() == 0) {
                        tv_tip.setText("搜索历史");
                    } else {
                        tv_tip.setText("搜索结果");
                    }
                    String tempName = et_search.getText().toString();
                    // 根据tempName去模糊查询数据库中有没有数据
                    queryData(tempName);
    
                }
            });
    
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    TextView textView = (TextView) view.findViewById(android.R.id.text1);
                    String name = textView.getText().toString();
                    et_search.setText(name);
                    Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
                    // TODO 获取到item上面的文字,根据该关键字跳转到另一个页面查询,由你自己去实现
                }
            });
    
            // 插入数据,便于测试,否则第一次进入没有数据怎么测试呀?
            Date date = new Date();
            long time = date.getTime();
            insertData("Leo" + time);
    
            // 第一次进入查询所有的历史记录
            queryData("");
        }
    
        /**
         * 插入数据
         */
        private void insertData(String tempName) {
            db = helper.getWritableDatabase();
            db.execSQL("insert into records(name) values('" + tempName + "')");
            db.close();
        }
    
        /**
         * 模糊查询数据
         */
        private void queryData(String tempName) {
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);
            // 创建adapter适配器对象
            adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },
                    new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            // 设置适配器
            listView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
        /**
         * 检查数据库中是否已经有该条记录
         */
        private boolean hasData(String tempName) {
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name =?", new String[]{tempName});
            //判断是否有下一个
            return cursor.moveToNext();
        }
    
        /**
         * 清空数据
         */
        private void deleteData() {
            db = helper.getWritableDatabase();
            db.execSQL("delete from records");
            db.close();
        }
    
        private void initView() {
            et_search = (EditText) findViewById(R.id.et_search);
            tv_tip = (TextView) findViewById(R.id.tv_tip);
            listView = (com.cwvs.microlife.MyListView) findViewById(R.id.listView);
            tv_clear = (TextView) findViewById(R.id.tv_clear);
    
            // 调整EditText左边的搜索按钮的大小
            Drawable drawable = getResources().getDrawable(R.drawable.search);
            drawable.setBounds(0, 0, 60, 60);// 第一0是距左边距离,第二0是距上边距离,60分别是长宽
            et_search.setCompoundDrawables(drawable, null, null, null);// 只放左边
        }
    }
    
    1. MyListView.java
    package com.cwvs.microlife;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.ListView;
    
    public class MyListView extends ListView {
        public MyListView(Context context) {
            super(context);
        }
    
        public MyListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
        }
    
    }
    
    1. activity_main.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusableInTouchMode="true"
        android:orientation="vertical"
        tools:context="${relativePackage}.${activityClass}">
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:background="#E54141"
            android:orientation="horizontal"
            android:paddingRight="16dp">
    
            <ImageView
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:layout_gravity="center_vertical"
                android:padding="10dp"
                android:src="@drawable/back" />
    
            <EditText
                android:id="@+id/et_search"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@null"
                android:drawableLeft="@drawable/search"
                android:drawablePadding="8dp"
                android:gravity="start|center_vertical"
                android:hint="输入查询的关键字"
                android:imeOptions="actionSearch"
                android:singleLine="true"
                android:textColor="@android:color/white"
                android:textSize="16sp" />
    
        </LinearLayout>
    
    
        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:paddingLeft="20dp"
    
                    >
    
                    <TextView
                        android:id="@+id/tv_tip"
                        android:layout_width="match_parent"
                        android:layout_height="50dp"
                        android:gravity="left|center_vertical"
                        android:text="搜索历史" />
    
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#EEEEEE"></View>
    
                    <com.cwvs.microlife.MyListView
                        android:id="@+id/listView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"></com.cwvs.microlife.MyListView>
    
    
                </LinearLayout>
    
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:background="#EEEEEE"></View>
    
                <TextView
                    android:id="@+id/tv_clear"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:background="#F6F6F6"
                    android:gravity="center"
                    android:text="清除搜索历史" />
    
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:layout_marginBottom="20dp"
                    android:background="#EEEEEE"></View>
            </LinearLayout>
    
        </ScrollView>
    </LinearLayout>

    完整案例源代码

    展开全文
  • 本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下。 本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及到...

    本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下。


    本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及到的知识点:

    1、数据库的增删改查操作

    2、监听软键盘回车按钮设置为搜索按钮 

    3、使用TextWatcher( )进行实时筛选 

    4、已搜索的关键字再次搜索不会重复添加到数据库 

    既然是要保存搜索记录,首先得建立数据库表:

    [java] view plain copy
    1. /** 
    2.  * 搜索记录帮助类 
    3.  * Created by 05 on 2016/7/27. 
    4.  */  
    5. public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {  
    6.   
    7.     private final static String DB_NAME = "temp.db";  
    8.     private final static int DB_VERSION = 1;  
    9.   
    10.     public RecordSQLiteOpenHelper(Context context) {  
    11.         super(context, DB_NAME, null, DB_VERSION);  
    12.     }  
    13.   
    14.     @Override  
    15.     public void onCreate(SQLiteDatabase db) {  
    16.         String sqlStr = "CREATE TABLE IF NOT EXISTS records (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);";  
    17.         db.execSQL(sqlStr);  
    18.     }  
    19.   
    20.     @Override  
    21.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    22.   
    23.     }  
    24. }  

    数据库操作类 ,增删改查都在里面:

    [html] view plain copy
    1. /**  
    2.  * 搜索记录操作类  
    3.  * Created by 05 on 2016/7/27.  
    4.  */  
    5. public class RecordsDao {  
    6.     RecordSQLiteOpenHelper recordHelper;  
    7.   
    8.     SQLiteDatabase recordsDb;  
    9.   
    10.     public RecordsDao(Context context) {  
    11.         recordHelper = new RecordSQLiteOpenHelper(context);  
    12.     }  
    13.   
    14.     //添加搜索记录  
    15.     public void addRecords(String record) {  
    16.   
    17.         if (!isHasRecord(record)) {  
    18.             recordsDb = recordHelper.getReadableDatabase();  
    19.             ContentValues values = new ContentValues();  
    20.             values.put("name", record);  
    21.             //添加  
    22.             recordsDb.insert("records", null, values);  
    23.             //关闭  
    24.             recordsDb.close();  
    25.         }  
    26.     }  
    27.   
    28.     //判断是否含有该搜索记录  
    29.     public boolean isHasRecord(String record) {  
    30.         boolean isHasRecord = false;  
    31.         recordsDb = recordHelper.getReadableDatabase();  
    32.         Cursor cursor = recordsDb.query("records", null, null, null, null, null, null);  
    33.         while (cursor.moveToNext()) {  
    34.             if (record.equals(cursor.getString(cursor.getColumnIndexOrThrow("name")))) {  
    35.                 isHasRecord = true;  
    36.             }  
    37.         }  
    38.         //关闭数据库  
    39.         recordsDb.close();  
    40.     cursor.close();  
    41.         return isHasRecord;  
    42.     }  
    43.   
    44.     //获取全部搜索记录  
    45.     public List<String> getRecordsList() {  
    46.         List<String> recordsList = new ArrayList<>();  
    47.         recordsDb = recordHelper.getReadableDatabase();  
    48.         Cursor cursor = recordsDb.query("records", null, null, null, null, null, null);  
    49.         while (cursor.moveToNext()) {  
    50.             String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));  
    51.             recordsList.add(name);  
    52.         }  
    53.         //关闭数据库  
    54.         recordsDb.close();  
    55.     cursor.close();  
    56.         return recordsList;  
    57.     }  
    58.   
    59.     //模糊查询  
    60.     public List<String> querySimlarRecord(String record){  
    61.         String queryStr = "select * from records where name like '%" + record + "%' order by name ";  
    62.         List<String> similarRecords = new ArrayList<>();  
    63.         Cursor cursorrecordHelper.getReadableDatabase().rawQuery(queryStr,null);  
    64.   
    65.         while (cursor.moveToNext()) {  
    66.             String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));  
    67.             similarRecords.add(name);  
    68.         }  
    69.   
    70.     cursor.close();  
    71.         return similarRecords;  
    72.     }  
    73.   
    74.     //清空搜索记录  
    75.     public void deleteAllRecords() {  
    76.         recordsDb = recordHelper.getWritableDatabase();  
    77.         recordsDb.execSQL("delete from records");  
    78.   
    79.         recordsDb.close();  
    80.     }  
    81.   
    82. }  



    数据库类已经封装好了,接下来就是界面代码:

    [html] view plain copy
    1. <span style="color:#333333;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:orientation="vertical" android:layout_width="match_parent"  
    3.     android:layout_height="match_parent">  
    4.   
    5.     <LinearLayout  
    6.         android:background="@color/base_green"  
    7.         android:layout_width="match_parent"  
    8.         android:layout_height="50dp">  
    9.   
    10.         <LinearLayout  
    11.             android:layout_margin="10dp"  
    12.             android:background="@drawable/input_border_layout"  
    13.             android:layout_weight="1"  
    14.             android:layout_width="0dp"  
    15.             android:layout_height="match_parent">  
    16.   
    17.             <ImageView  
    18.                 android:padding="5dp"  
    19.                 android:layout_gravity="center_vertical"  
    20.                 android:layout_width="30dp"  
    21.                 android:layout_height="match_parent"  
    22.                 android:src="@mipmap/my_village_search"/>  
    23.   
    24.             <EditText  
    25.                 android:id="@+id/input_search_content_et"  
    26.                 android:layout_margin="5dp"  
    27.                 android:textSize="14sp"  
    28.                 android:singleLine="true"  
    29.                 android:imeOptions="actionSearch"  
    30.                 android:layout_gravity="center_vertical"  
    31.                 android:background="@drawable/input_no_border_layout"  
    32.                 android:layout_width="match_parent"  
    33.                 android:layout_height="wrap_content"  
    34.                 android:hint="请输入你要搜索的内容"/></span>  
    35. <!-- 以上的singleLine和imeOptions属性代码是将弹出的软键盘的回车键替换成搜索键的关键,当然也可以换成发送键 等等,可以去查一下该属性 --></span>  
    36.         </LinearLayout>  
    37.   
    38.         <TextView  
    39.             android:id="@+id/search_content_cancel_tv"  
    40.             android:padding="10dp"  
    41.             android:layout_gravity="center_vertical"  
    42.             android:gravity="center"  
    43.             android:layout_width="wrap_content"  
    44.             android:layout_height="match_parent"  
    45.             android:textSize="18sp"  
    46.             android:text="取消"  
    47.             android:textColor="@color/white"/>  
    48.   
    49.     </LinearLayout>  
    50.   
    51.     <RelativeLayout  
    52.         android:layout_width="match_parent"  
    53.         android:layout_height="match_parent">  
    54.   
    55.         <LinearLayout  
    56.             android:orientation="vertical"  
    57.             android:id="@+id/search_content_show_ll"  
    58.             android:layout_width="match_parent"  
    59.             android:layout_height="wrap_content">  
    60.         </LinearLayout>  
    61.   
    62.     </RelativeLayout>  
    63.   
    64. </LinearLayout></span>  


    因为是将搜索的历史信息做成显示隐藏的效果,所以单独写了一个历史信息的layout:

    [html] view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical" android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.   
    6.     <LinearLayout  
    7.         android:orientation="vertical"  
    8.         android:layout_width="match_parent"  
    9.         android:layout_height="wrap_content">  
    10.   
    11.         <ListView  
    12.             android:id="@+id/search_records_lv"  
    13.             android:layout_width="match_parent"  
    14.             android:layout_height="wrap_content"/>  
    15.   
    16.         <View  
    17.             android:layout_width="match_parent"  
    18.             android:layout_height="0.1dp"  
    19.             android:background="@color/custom_gray"/>  
    20.   
    21.         <TextView  
    22.             android:background="@color/white"  
    23.             android:id="@+id/clear_all_records_tv"  
    24.             android:layout_width="match_parent"  
    25.             android:layout_height="40dp"  
    26.             android:textSize="16sp"  
    27.             android:gravity="center"  
    28.             android:textColor="@color/clear_red"  
    29.             android:text="清除历史记录"/>  
    30.   
    31.         <View  
    32.             android:layout_width="match_parent"  
    33.             android:layout_height="0.1dp"  
    34.             android:background="@color/custom_gray"/>  
    35.   
    36.     </LinearLayout>  
    37.   
    38. </LinearLayout>  

    既然用到了listview来显示历史搜索信息,就需要写listview的item:

    [html] view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical" android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.   
    6.     <LinearLayout  
    7.         android:background="@color/white"  
    8.         android:orientation="horizontal"  
    9.         android:layout_width="match_parent"  
    10.         android:layout_height="40dp">  
    11.   
    12.         <TextView  
    13.             android:id="@+id/search_content_tv"  
    14.             android:layout_width="match_parent"  
    15.             android:layout_height="wrap_content"  
    16.             android:drawableLeft="@mipmap/search_icon"  
    17.             android:drawablePadding="8dp"  
    18.             android:layout_margin="10dp"  
    19.             android:layout_gravity="center_vertical"  
    20.         />  
    21.   
    22.     </LinearLayout>  
    23.   
    24. </LinearLayout>  

    用到了listview,当然还需要适配器,因为目前只有文本可以使用SimpleAdapter,为了以后能添加别的,我还是自定义了一个Adapter:

    [java] view plain copy
    1. /** 
    2.  * Created by 05 on 2016/7/27. 
    3.  */  
    4. public class SearchRecordsAdapter extends BaseAdapter {  
    5.   
    6.     private Context context;  
    7.     private List<String> searchRecordsList;  
    8.     private LayoutInflater inflater;  
    9.   
    10.     public SearchRecordsAdapter(Context context, List<String> searchRecordsList) {  
    11.         this.context = context;  
    12.         this.searchRecordsList = searchRecordsList;  
    13.         inflater = LayoutInflater.from(context);  
    14.     }  
    15.   
    16.     @Override  
    17.     public int getCount() {  
    18.         return searchRecordsList.size() == 0 ? 0 : searchRecordsList.size();  
    19.     }  
    20.   
    21.     @Override  
    22.     public Object getItem(int position) {  
    23.         return searchRecordsList.size() == 0 ? null : searchRecordsList.get(position);  
    24.     }  
    25.   
    26.     @Override  
    27.     public long getItemId(int position) {  
    28.         return position;  
    29.     }  
    30.   
    31.     @Override  
    32.     public View getView(int position, View convertView, ViewGroup parent) {  
    33.         ViewHolder viewHolder;  
    34.         if(null == convertView){  
    35.             viewHolder = new ViewHolder();  
    36.             convertView = inflater.inflate(R.layout.saerch_records_list_item,null);  
    37.             viewHolder.recordTv = (TextView) convertView.findViewById(R.id.search_content_tv);  
    38.   
    39.             convertView.setTag(viewHolder);  
    40.         }else{  
    41.             viewHolder = (ViewHolder) convertView.getTag();  
    42.         }  
    43.   
    44.         String content = searchRecordsList.get(position);  
    45.         viewHolder.recordTv.setText(content);  
    46.   
    47.         return convertView;  
    48.     }  
    49.   
    50.     private class ViewHolder {  
    51.         TextView recordTv;  
    52.     }  
    53. }  

    最后就是界面代码了:

    [java] view plain copy
    1. /** 
    2.  * 搜索界面 
    3.  * Created by 05 on 2016/7/26. 
    4.  */  
    5. public class SearchContentActivity extends BaseActivity implements View.OnClickListener {  
    6.     private EditText searchContentEt;  
    7.     private SearchRecordsAdapter recordsAdapter;  
    8.     private View recordsHistoryView;  
    9.     private ListView recordsListLv;  
    10.     private TextView clearAllRecordsTv;  
    11.     private LinearLayout searchRecordsLl;  
    12.   
    13.     private List<String> searchRecordsList;  
    14.     private List<String> tempList;  
    15.     private RecordsDao recordsDao;  
    16.   
    17.     @Override  
    18.     protected void onCreate(Bundle savedInstanceState) {  
    19.         super.onCreate(savedInstanceState);  
    20.         BaseSetContentView(R.layout.activity_search_content);  
    21.   
    22.         initView();  
    23.         initData();  
    24.         bindAdapter();  
    25.         initListener();  
    26.     }  
    27.   
    28.     private void initView() {  
    29.         setHideHeader();  
    30.         initRecordsView();  
    31.   
    32.         searchRecordsLl = (LinearLayout) findViewById(R.id.search_content_show_ll);  
    33.         searchContentEt = (EditText) findViewById(R.id.input_search_content_et);  
    34.   
    35.         //添加搜索view  
    36.         searchRecordsLl.addView(recordsHistoryView);  
    37.   
    38.     }  
    39.   
    40.     //初始化搜索历史记录View  
    41.     private void initRecordsView() {  
    42.         recordsHistoryView = LayoutInflater.from(this).inflate(R.layout.search_records_list_layout, null);  
    43.         //显示历史记录lv  
    44.         recordsListLv = (ListView) recordsHistoryView.findViewById(R.id.search_records_lv);  
    45.         //清除搜索历史记录  
    46.         clearAllRecordsTv = (TextView) recordsHistoryView.findViewById(R.id.clear_all_records_tv);  
    47.     }  
    48.   
    49.   
    50.     private void initData() {  
    51.         recordsDao = new RecordsDao(this);  
    52.         searchRecordsList = new ArrayList<>();  
    53.         tempList = new ArrayList<>();  
    54.         tempList.addAll(recordsDao.getRecordsList());  
    55.   
    56.         reversedList();  
    57.         //第一次进入判断数据库中是否有历史记录,没有则不显示  
    58.         checkRecordsSize();  
    59.     }  
    60.   
    61.   
    62.     private void bindAdapter() {  
    63.         recordsAdapter = new SearchRecordsAdapter(this, searchRecordsList);  
    64.         recordsListLv.setAdapter(recordsAdapter);  
    65.     }  
    66.   
    67.     private void initListener() {  
    68.         clearAllRecordsTv.setOnClickListener(this);  
    69.         searchContentEt.setOnEditorActionListener(new TextView.OnEditorActionListener() {  
    70.   
    71.             @Override  
    72.             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {  
    73.                 if (actionId == EditorInfo.IME_ACTION_SEARCH) {  
    74.                     if (searchContentEt.getText().toString().length() > 0) {  
    75.   
    76.                         String record = searchContentEt.getText().toString();  
    77.   
    78.                         //判断数据库中是否存在该记录  
    79.                         if (!recordsDao.isHasRecord(record)) {  
    80.                             tempList.add(record);  
    81.                         }  
    82.                         //将搜索记录保存至数据库中  
    83.                         recordsDao.addRecords(record);  
    84.                         reversedList();  
    85.                         checkRecordsSize();  
    86.                         recordsAdapter.notifyDataSetChanged();  
    87.   
    88.                         //根据关键词去搜索  
    89.                           
    90.                     } else {  
    91.                         ToastUtils.showToast(SearchContentActivity.this"搜索内容不能为空");  
    92.                     }  
    93.                 }  
    94.                 return false;  
    95.             }  
    96.         });  
    97.   
    98.         //根据输入的信息去模糊搜索  
    99.         searchContentEt.addTextChangedListener(new TextWatcher() {  
    100.             @Override  
    101.             public void beforeTextChanged(CharSequence s, int start, int count, int after) {  
    102.   
    103.             }  
    104.   
    105.             @Override  
    106.             public void onTextChanged(CharSequence s, int start, int before, int count) {  
    107.   
    108.             }  
    109.   
    110.             @Override  
    111.             public void afterTextChanged(Editable s) {  
    112.                 String tempName = searchContentEt.getText().toString();  
    113.                 tempList.clear();  
    114.                 tempList.addAll(recordsDao.querySimlarRecord(tempName));  
    115.                 reversedList();  
    116.                 checkRecordsSize();  
    117.                 recordsAdapter.notifyDataSetChanged();  
    118.             }  
    119.         });  
    120.   
    121.         //历史记录点击事件  
    122.         recordsListLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
    123.             @Override  
    124.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
    125.                 //将获取到的字符串传到搜索结果界面  
    126.   
    127.             }  
    128.         });  
    129.     }  
    130.   
    131.     //当没有匹配的搜索数据的时候不显示历史记录栏  
    132.     private void checkRecordsSize(){  
    133.         if(searchRecordsList.size() == 0){  
    134.             searchRecordsLl.setVisibility(View.GONE);  
    135.         }else{  
    136.             searchRecordsLl.setVisibility(View.VISIBLE);  
    137.         }  
    138.     }  
    139.   
    140.     @Override  
    141.     public void onClick(View v) {  
    142.         switch (v.getId()){  
    143.             //清空所有历史数据  
    144.             case R.id.clear_all_records_tv:  
    145.                 tempList.clear();  
    146.                 reversedList();  
    147.                 recordsDao.deleteAllRecords();  
    148.                 recordsAdapter.notifyDataSetChanged();  
    149.                 searchRecordsLl.setVisibility(View.GONE);  
    150.                 break;  
    151.         }  
    152.     }  
    153.   
    154.     //颠倒list顺序,用户输入的信息会从上依次往下显示  
    155.     private void reversedList(){  
    156.         searchRecordsList.clear();  
    157.         for(int i = tempList.size() - 1 ; i >= 0 ; i --){  
    158.             searchRecordsList.add(tempList.get(i));  
    159.         }  
    160.     }  
    161. }  

    以上就是实现搜索记录存储,搜索信息模糊查询的全部代码了,供大家参考,当然也给自己提供一个整理思路的锻炼。
    展开全文
  • 其实这部分主要是实现很多逻辑功能顺序,点击搜索出来的内容显示在一个listview中,然后历史记录又显示在另一个listview中,只要设置listview.setVisibility(View.GONE/VISIBLE),实现切换,就差不多了,以及清除...

    其实这部分主要是实现很多逻辑功能顺序,点击搜索出来的内容显示在一个listview中,然后历史记录又显示在另一个listview中,只要设置listview.setVisibility(View.GONE/VISIBLE),实现切换,就差不多了,以及清除按钮的显示,详细的解释会在代码中呈现。代码比较繁琐,毕竟能力有限,纯粹是根据自己想法实现的逻辑功能,还有写地方不够完美,仅供参考。

    首先是主界面SearchActivity类:

    <pre name="code" class="java">package com.example.activity;
    
    import java.security.PublicKey;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.example.adapter.SearchHistoryAdapter;
    import com.example.adapter.SearchShowLvAdapter;
    import com.example.db.HistoryHelper;
    import com.example.domain.Contance;
    import com.example.domain.ContanceKey;
    import com.example.domain.HistoryShowBean;
    import com.example.domain.ImportContance;
    import com.example.domain.JingdianName;
    import com.example.domain.SearchShowBean;
    import com.example.utils.SearchClearEditText;
    
    import android.R.integer;
    import android.app.Activity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.Window;
    import android.view.View.OnClickListener;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class SearchActivity extends Activity implements OnClickListener,
    		OnItemClickListener {
    
    	private ImageButton ib_back_normal; // 搜索框左侧返回按钮
    	private TextView tv_search; // 搜索框右边的搜索字样
    	SearchClearEditText clear_et;
    	private ListView lv_search_xianshi, lv_search_history;
    	private Button clear_search_history_btn;
    
    	// 初始化数据库打开器
    	HistoryHelper helper;
    	private SearchHistoryAdapter his_adapter;
    
    	private List<SearchShowBean> sea_data;
    	private List<HistoryShowBean> his_data;
    	static List<String> list = new ArrayList<String>();
    
    	private Handler handler = new Handler() {
    		@Override
    		public void handleMessage(Message msg) {
    			switch (msg.what) {
    			case 1:
    				// 点击清除记录按钮,刷新界面
    				his_adapter.refresh(queryHistoryData());
    				break;
    
    			default:
    				break;
    			}
    		};
    	};
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		// 设置无标题,使用自己的布局
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		setContentView(R.layout.clear_et_activity);
    
    		init();
    
    	}
    
    	/*
    	 * 初始化组件
    	 */
    	private void init() {
    		ib_back_normal = (ImageButton) findViewById(R.id.ib_back_normal);
    		tv_search = (TextView) findViewById(R.id.tv_search);
    		clear_et = (SearchClearEditText) findViewById(R.id.et_clear);
    		clear_search_history_btn = (Button) findViewById(R.id.clear_search_history_btn);
    
    		lv_search_xianshi = (ListView) findViewById(R.id.search_xianshi_lv);
    		lv_search_history = (ListView) findViewById(R.id.search_history_lv);
    
    		his_data = queryHistoryData();
    
    		his_adapter = new SearchHistoryAdapter(his_data, this);
    		lv_search_history.setAdapter(his_adapter);
    
    		ib_back_normal.setOnClickListener(this);
    		tv_search.setOnClickListener(this);
    		clear_search_history_btn.setOnClickListener(this);
    
    		lv_search_history.setOnItemClickListener(this);
    		lv_search_xianshi.setOnItemClickListener(this);
    
    	}
    
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.ib_back_normal:
    			Intent intent = new Intent(SearchActivity.this, MainActivity.class);
    			startActivity(intent);
    			SearchActivity.this.finish(); // 结束当前界面
    			// lv_search_xianshi.setVisibility(View.GONE);
    			break;
    		case R.id.tv_search: // 点击搜索按钮
    			/*
    			 * 点击搜索按钮先清空,是因为数据使用list集合保存的,如果搜索一个景点出来数据后,
    			 * 直接搜索另一个,就会叠加,所以先清空,这样每次显示的都是最新的
    			 */
    			list.removeAll(list);
    			// 点击搜索按钮,使得显示搜索结果的listview显示出来
    			lv_search_xianshi.setVisibility(View.VISIBLE);
    			lv_search_history.setVisibility(View.GONE);
    			clear_search_history_btn.setVisibility(View.GONE);
    
    			String search = clear_et.getText().toString().trim();
    			int count = 0;
    			for (int i = 0; i < JingdianName.names.length; i++) {
    				if (JingdianName.names[i].contains(search) == true) {
    					list.add(JingdianName.names[i]);
    					count++;
    				}
    			}
    			if (count == 0) { // 如果一个也没有查到,就显示没有景点
    				list.removeAll(list); // 清空集合数据,重新查询
    				getData(list, lv_search_xianshi);
    				Toast.makeText(getApplicationContext(), "没有该景点",
    						Toast.LENGTH_SHORT).show();
    			} else { // 有数据就显示
    				getData(list, lv_search_xianshi);
    			}
    
    			// 插入数据库数据
    			insertHistory(search);
    
    			break;
    
    		case R.id.clear_search_history_btn: // 点击清除历史记录按钮
    			deleteHistory();
    			break;
    		default:
    			break;
    		}
    	}
    
    	/*
    	 * 删除历史记录
    	 */
    	private void deleteHistory() {
    		helper = new HistoryHelper(getApplicationContext());
    		SQLiteDatabase db = helper.getWritableDatabase();
    		// 删除表。
    		db.execSQL("delete from " + Contance.HISTORY_TABLENAME);
    		new Thread(new Runnable() {
    
    			@Override
    			public void run() {
    				// 此处handler发送一个message,用来更新ui
    				Message msg = new Message();
    				msg.what = 1;
    				handler.sendMessage(msg);
    			}
    		}).start();
    		// his_adapter.refresh(queryHistoryData());
    		db.close();
    	}
    
    	/*
    	 * 插入历史记录,点击按钮,获得edittext的值,写到数据库
    	 */
    	private void insertHistory(String search) {
    		helper = new HistoryHelper(getApplicationContext());
    		// 插入数据库
    		SQLiteDatabase db = helper.getWritableDatabase();
    		Log.i("create", "数据库表history创建成功");
    		int count = 0;
    		// 查询数据库,判断edittext的内容是否已经存在,如果存在了,就不写了,如果不存在,就插入数据库
    		// 取回查询存放history表的h_name列的list集合
    		List<String> list = queryHistorySql();
    		for (int i = 0; i < list.size(); i++) {
    			// 获取搜索框的输入内容,和数据已经存在的记录比对,如果有一样的,就count增加;
    			if (list.get(i).equals(search)) {
    				count++;
    			}
    		}
    		// 如果count == 0,说明没有重复的数据,就可以插入数据库history表中
    		if (count == 0) {
    			db.execSQL("insert into " + Contance.HISTORY_TABLENAME
    					+ " values(?,?)", new Object[] { null, search });
    			Log.i("create", "数据库表history数据插入成功");
    		} else {
    			// Toast.makeText(getApplicationContext(), "已存在",
    			// Toast.LENGTH_SHORT)
    			// .show();
    		}
    
    		db.close();
    	}
    
    	/*
    	 * 查询数据库的h_name一列,然后放到list集合中,用于判断是否插入数据
    	 */
    	private List<String> queryHistorySql() {
    		helper = new HistoryHelper(getApplicationContext());
    		List<String> list = new ArrayList<String>();
    		SQLiteDatabase db = helper.getReadableDatabase();
    		Cursor cursor = db.rawQuery("select * from "
    				+ Contance.HISTORY_TABLENAME, null);
    		cursor.moveToFirst();
    		while (!cursor.isAfterLast()) {
    			// 查询数据库,取出h_name这一列,然后全部放到list集合中,在前面调用此方法的时候,用来判断
    			String name = cursor.getString(cursor.getColumnIndex("h_name"));
    			list.add(name);
    			cursor.moveToNext();
    		}
    
    		db.close();
    		// 返回一个list集合
    		return list;
    	}
    
    	/*
    	 * 点击搜索按钮后,查询出来的结果
    	 */
    	private void getData(List<String> list, ListView listView) {
    		sea_data = new ArrayList<SearchShowBean>();
    		for (int i = 0; i < list.size(); i++) {
    			SearchShowBean bean = new SearchShowBean();
    			bean.setJingdian(list.get(i));
    			bean.setImage(getResources().getDrawable(
    					R.drawable.umeng_socialize_search_icon));
    			sea_data.add(bean);
    		}
    		listView.setAdapter(new SearchShowLvAdapter(this, sea_data));
    	}
    
    	// 将每一行的数据封装成一个HistoryShowBean对象,然后放到his_list中
    	private List<HistoryShowBean> queryHistoryData() {
    		helper = new HistoryHelper(getApplicationContext());
    		List<HistoryShowBean> his_list = new ArrayList<HistoryShowBean>();
    		SQLiteDatabase db = helper.getReadableDatabase();
    		Cursor his_c = db.rawQuery("select * from "
    				+ Contance.HISTORY_TABLENAME, null);
    
    		his_c.moveToFirst();
    		while (!his_c.isAfterLast()) {
    			int h_id = his_c.getInt(his_c.getColumnIndex("_id"));
    			String h_name = his_c.getString(his_c.getColumnIndex("h_name"));
    
    			// 用一个HistoryShowBean类来封装得到的数据
    			final HistoryShowBean his_bean = new HistoryShowBean();
    			his_bean.setJingdian(h_name);
    			his_bean.setImage(getResources().getDrawable(
    					R.drawable.history_icon));
    			his_list.add(his_bean);
    			his_c.moveToNext();
    		}
    		if (his_list.size() == 0) {
    			clear_search_history_btn.setVisibility(View.GONE);
    		}
    		db.close();
    		return his_list;
    
    	}
    
    	@Override
    	public boolean onKeyDown(int keyCode, KeyEvent event) {
    		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {// 按下的如果是BACK,同时没有重复
    			Intent intent = new Intent(SearchActivity.this, MainActivity.class);
    			startActivity(intent);
    			SearchActivity.this.finish();
    			// 这里不需要执行父类的点击事件,所以直接return
    			return true;
    		}
    		// 继续执行父类的其他点击事件
    		return super.onKeyDown(keyCode, event);
    	}
    
    	@Override
    	public void onItemClick(AdapterView<?> parent, View view, int position,
    			long id) {
    		switch (parent.getId()) { // 获得listview的id
    		case R.id.search_xianshi_lv: // 显示listview
    			// 获得当前点击的item
    			view = lv_search_xianshi.getChildAt(position);
    			// 获得item中的textview控件,并初始化
    			TextView tv = (TextView) view.findViewById(R.id.search_xianshi_tv);
    			// 获得textview的值
    			String str = tv.getText().toString().trim();
    			// 进行数据库查询并且跳转
    			listViewJump(str);
    			break;
    		case R.id.search_history_lv:
    			view = lv_search_history.getChildAt(position);
    			TextView tv1 = (TextView) view.findViewById(R.id.search_history_tv);
    			String str1 = tv1.getText().toString().trim();
    			String string = null;
    			// 之前已经把数据库的列“mingcheng”的值已经放到了一个数组中
    			// 判断点击的item中的textview的值在mingcheng中是否存在,如果存在,就把那个值给了数据库查询
    			Log.i("searchAcitivity", "11111");
    			// Boolean boolean1 = null;
    			int count1 = 0;
    			for (int i = 0; i < JingdianName.names.length; i++) {
    				Log.i("searchAcitivity", "22222");
    				if (JingdianName.names[i].equals(str1)) {
    					Log.i("searchAcitivity", "33333");
    					string = JingdianName.names[i];
    					// 方法放在for循环外面会有问题
    					listViewJump(string);
    					Log.i("searchAcitivity", "44444");
    					// boolean1 = true;
    					count1++;
    					break;
    				}
    			}
    			if (count1 == 0) {
    				Log.i("searchAcitivity", "88888");
    				Toast.makeText(getApplicationContext(), "没有该景点",
    						Toast.LENGTH_SHORT).show();
    			}
    			Log.i("searchAcitivity", "99999");
    
    			break;
    		default:
    			break;
    		}
    	}
    
    	private void listViewJump(String str) {
    		String sql = "select * from jingdian where mingcheng = '" + str + "'";
    		Cursor c = Contance.SQLITE.rawQuery(sql, null);
    		c.moveToFirst();
    		while (!c.isAfterLast()) {
    			ImportContance.MINGCHENG = c.getString(c
    					.getColumnIndex("mingcheng"));
    			ImportContance.JIESHAO = c.getString(c.getColumnIndex("jieshao"));
    			ImportContance.LEIXING = c.getString(c.getColumnIndex("leixing"));
    			ImportContance.JIJIE = c.getString(c.getColumnIndex("jijie"));
    			ImportContance.JIANYI = c.getString(c.getColumnIndex("jianyi"));
    			ImportContance.MENPIAO = c.getString(c.getColumnIndex("menpiao"));
    			ImportContance.SHIJIAN = c.getString(c.getColumnIndex("shijian"));
    			ImportContance.DIZHI = c.getString(c.getColumnIndex("dizhi"));
    			c.moveToNext();
    		}
    
    		c.close();
    
    		Intent intent = new Intent(SearchActivity.this, SingleActivity.class);
    		intent.putExtra(ContanceKey.KEY_MINGCHENG, ImportContance.MINGCHENG);
    		intent.putExtra(ContanceKey.KEY_JIESHAO, ImportContance.JIESHAO);
    		intent.putExtra(ContanceKey.KEY_LEIXING, ImportContance.LEIXING);
    		intent.putExtra(ContanceKey.KEY_JIJIE, ImportContance.JIJIE);
    		intent.putExtra(ContanceKey.KEY_JIANYI, ImportContance.JIANYI);
    		intent.putExtra(ContanceKey.KEY_MENPIAO, ImportContance.MENPIAO);
    		intent.putExtra(ContanceKey.KEY_SHIJIAN, ImportContance.SHIJIAN);
    		intent.putExtra(ContanceKey.KEY_DIZHI, ImportContance.DIZHI);
    		startActivity(intent);
    		SearchActivity.this.finish();
    	}
    }
    


    
    


    下来就是主界面的布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:id="@+id/layout_clear_et"
            android:layout_width="fill_parent"
            android:layout_height="44dp"
            android:background="@drawable/nav_bg"
            android:orientation="horizontal" >
    
            <ImageButton
                android:id="@+id/ib_back_normal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|left"
                android:background="@drawable/search_et_back" />
    
            <com.example.utils.SearchClearEditText
                android:id="@+id/et_clear"
                android:layout_width="wrap_content"
                android:layout_height="32dp"
                android:layout_gravity="center_vertical"
                android:layout_weight="0.91"
                android:background="@drawable/et_search_clear_attr"
                android:drawableLeft="@drawable/umeng_socialize_search_icon"
                android:drawableRight="@drawable/search_clear"
                android:ems="10"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:hint="请输入景点"
                android:paddingLeft="5dp"
                android:paddingRight="3dp"
                android:singleLine="true" />
    
            <TextView
                android:id="@+id/tv_search"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:clickable="true"
                android:padding="5dp"
                android:text="搜索"
                android:textColor="#FFFFFF"
                android:textSize="18dp" />
        </LinearLayout>
    
        <FrameLayout
            android:id="@+id/search_framelayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
    
            <ListView
                android:id="@+id/search_history_lv"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:visibility="visible" >
            </ListView>
    
            <ListView
                android:id="@+id/search_xianshi_lv"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:visibility="gone" >
            </ListView>
        </FrameLayout>
    
        <Button
            android:id="@+id/clear_search_history_btn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:drawableLeft="@drawable/delete_history_icon"
            android:text="清除历史记录"
            android:visibility="visible" >
        </Button>
    
    </LinearLayout>

    历史记录显示的listview的适配器adapter类:

    public class SearchHistoryAdapter extends BaseAdapter {
    
    	private Context mContext;
    	private List<HistoryShowBean> mdata;
    
    	public SearchHistoryAdapter(List<HistoryShowBean> data, Context context) {
    		this.mContext = context;
    		this.mdata = data;
    	}
    
    	// 刷新适配器,更新数据
    	public void refresh(List<HistoryShowBean> data) {
    		this.mdata = data;
    		notifyDataSetChanged();
    	}
    
    	@Override
    	public int getCount() {
    		return mdata.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    		return null;
    	}
    
    	@Override
    	public long getItemId(int position) {
    		return 0;
    	}
    
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		ViewHolder holder;
    		if (convertView == null) {
    			convertView = View.inflate(mContext,
    					R.layout.search_history_lv_item, null);
    			holder = new ViewHolder();
    			holder.textView = (TextView) convertView
    					.findViewById(R.id.search_history_tv);
    			holder.imageView = (ImageView) convertView
    					.findViewById(R.id.search_history_iv);
    			convertView.setTag(holder);
    		} else {
    			holder = (ViewHolder) convertView.getTag();
    		}
    
    		HistoryShowBean bean = mdata.get(position);
    		holder.textView.setText(bean.getJingdian());
    		holder.imageView.setImageDrawable(bean.getImage());
    
    		return convertView;
    	}
    
    	private static class ViewHolder {
    		ImageView imageView;
    		TextView textView;
    	}
    
    }
    

    点击搜索按钮当前显示的listview的适配器adapter类:

    public class SearchShowLvAdapter extends BaseAdapter {
    
    	private Context mContext;
    	private List<SearchShowBean> mdata;
    
    	public SearchShowLvAdapter(Context context, List<SearchShowBean> data) {
    		this.mContext = context;
    		this.mdata = data;
    	}
    
    	@Override
    	public int getCount() {
    		return mdata.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    		return null;
    	}
    
    	@Override
    	public long getItemId(int position) {
    		return 0;
    	}
    
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		ViewHolder holder;
    		if (convertView == null) {
    			// 如果视图等于null,就给个布局
    			convertView = View.inflate(mContext,
    					R.layout.search_xianshi_lv_item, null);
    			// 初始化hodler
    			holder = new ViewHolder();
    			// 每项的视图布局是一样的
    			holder.textView = (TextView) convertView
    					.findViewById(R.id.search_xianshi_tv);
    			holder.imageView = (ImageView) convertView
    					.findViewById(R.id.search_xianshi_iv);
    			// 给View添加数据,然后用getTag()取出来
    			convertView.setTag(holder);
    		} else {
    			holder = (ViewHolder) convertView.getTag();
    		}
    
    		SearchShowBean bean = mdata.get(position);
    		holder.textView.setText(bean.getJingdian());
    		holder.imageView.setImageDrawable(bean.getImage());
    
    		return convertView;
    	}
    
    	/*
    	 * 临时的储存器
    	 */
    	private static class ViewHolder {
    		TextView textView;
    		ImageView imageView;
    	}
    
    }
    

    对应的两个javabean类:

    public class HistoryShowBean {
    	private int _id;
    	private String jingdian;
    	private Drawable image;
    
    	public int get_id() {
    		return _id;
    	}
    
    	public void set_id(int _id) {
    		this._id = _id;
    	}
    
    	public Drawable getImage() {
    		return image;
    	}
    
    	public void setImage(Drawable image) {
    		this.image = image;
    	}
    
    	public String getJingdian() {
    		return jingdian;
    	}
    
    	public void setJingdian(String jingdian) {
    		this.jingdian = jingdian;
    	}
    }
    

    public class SearchShowBean {
    	private String jingdian;
    	private Drawable image;
    
    	public Drawable getImage() {
    		return image;
    	}
    
    	public void setImage(Drawable image) {
    		this.image = image;
    	}
    
    	public String getJingdian() {
    		return jingdian;
    	}
    
    	public void setJingdian(String jingdian) {
    		this.jingdian = jingdian;
    	}
    }
    

    以及数据建表的helper类:

    public class HistoryHelper extends SQLiteOpenHelper {
    
    	private static final int DB_VERSION = 1;
    
    	public HistoryHelper(Context context) {
    		super(context, Contance.DB_NAME, null, DB_VERSION);
    	}
    
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		db.execSQL(Contance.CREAT_HISTORY);
    	}
    
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    	}
    
    }

    大致就是这些,下面是原码


    项目原码





    展开全文
  • android搜索功能实现

    万次阅读 多人点赞 2016-05-21 23:33:24
    这里实现的是搜索框时时查询,代码中是在数据库中使用的模糊查询; 整个布局使用的是线性布局,搜索框又是一个线性布局(里面包含一个相对布局和一个TextView,相对布局里面有一个EditText和ImageVIew),下面是一个...
  • Android实现ListView的A-Z字母排序和过滤搜索功能,完整源码,小伙伴需要的来CSDN下载吧!项目详情http://blog.csdn.net/xiaanming/article/details/12684155
  • Android搜索实时显示功能实现

    千次阅读 2017-08-12 12:29:42
    前言作为一名Android开发小白,应该时刻督促自己不断的学习技术,最近遇到了一个和搜索有关的问题,就学习找时间学习了一下,如何实现简单Android搜索功能并可以实时预览搜索结果,整体思路应该和平常我们见到的...
  • Android开发中搜索功能的实现

    万次阅读 多人点赞 2016-12-14 17:45:00
    现在很多的app中都有搜索功能。也就是说搜索栏下面有一个列表,列表中放的内容可能是游戏,也有可能是其他的内容。这时候,我们可以在搜索框中输入你想要搜索的内容,这时候,下面的列表就会出现你想要的内容。别...
  • 开启android软键盘搜索功能

    千次阅读 2017-12-28 14:38:14
    通常情况下,此时的软键盘只包含基本的字母、标点符号、删除键和换行键等基本的功能区域,不包含搜索区域。如下图所示:  有些情况下,由于项目需求或设计的需要,我们需要开启并监听android手机软键盘的功能,...
  • 不常用的东西总是在遗忘!参考 Android Studio查找功能(搜索功能)及快捷键 我的Android进阶之旅——>解决Android Studio全局搜索搜不到结果的问题
  • android studio搜索功能

    千次阅读 2017-06-20 15:28:14
    权声明:本文为博主原创文章,未经博主允许不得转载。 1、在当前窗口查找文本【Ctrl+F】 F3 向下查找关键字出现位置  Shift+F3 向上一个关键字出现位置 2、在当前工程内查找文本...3、查找
  • android 调用输入法 搜索功能

    千次阅读 2018-03-28 17:15:16
    android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:imeOptions=&...
  • 本文主要为大家分享了Android实现搜索功能,并且可以实时显示搜索的历史记录,根据输入的内容去模糊查询,供大家参考,界面图如下。 本案例实现起来也非常的简单,所以可以直接拿来嵌入项目中使用,主要涉及到...
  • 一、概述 使用menu配合searchview可以实现常见的搜索框,详细介绍使用参考文章,我自己的项目没有采用这种方式,...主要是这两个代码实现系统输入法的搜索按钮android:singleLine="true",android:imeOptions="a...
  • Android 添加一个搜索功能

    千次阅读 2016-07-29 21:39:53
    android3.0以后,使用SearchView组件,可以在app bar添加一个搜索功能,你可以定义SearchView什么时候显示,什么时候不显示。添加SearchView在App Bar上首先你要新建一个 menu 文件,(所有要在bar中显示的,都...
  • android实现关键字搜索功能

    千次阅读 2013-11-29 11:39:44
    //以关键字查找日记为例,主要是Sql语句 public ArrayList searchNotes(String keywords) {  if (keywords != null) {  ArrayList dList = new ArrayList();  Cursor cusror = mDb.query(true, DATABASE_TABLE, ...
  • 系统键盘的搜索按钮,默认情况下是被隐藏的,如果要使用必须要手动设置,才可以调用搜索按键功能。具体使用,只需要如下三个步骤:1:在布局文件中的EditText中添加如下两个属性android:imeOptions="...
  • Android提供语音搜索功能

    千次阅读 2011-11-10 16:31:42
    只需要在searchable配置文件中写入下面的代码,很简单: xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android"  android:label="@... android:hint="@string
  • 实现自定义搜索框(实际上就是一个EditText): android:id="@+id/music_search_rl" android:layout_width="match_parent" android:layout_height="30dp" android:layout_margin="5d
  • 实现类似Android联系人搜索功能

    千次阅读 2015-06-24 11:46:22
    执行搜索: 2》布局文件如下: res/layout/main_activity.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:lay
  • android 实现 搜索保存历史记录功能

    万次阅读 多人点赞 2015-12-29 16:57:14
    大家应该做这个功能 首先想到的是用AutoCompleteTextView 这个控件非常好用 ,而且代码写起来也是非常简单 而且还是自动匹配提示 具体实现方法: 代码实现:  android:layout_width="match_parent"  android:...
  • android5.0系统设置搜索功能简析

    千次阅读 2015-05-10 19:17:47
    简单介绍系统设置搜索功能实现,初步熟悉搜索数据库构建规则以及匹配逻辑。 二、相关问题解答 1、系统设置可对那些设置项进行构建搜索数据库? 答:系统设置对数据项的构建规则在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,803
精华内容 43,521
关键字:

android搜索功能