1. 程式人生 > >利用AutoCompleteTextView連線到資料庫實現自動提示功能

利用AutoCompleteTextView連線到資料庫實現自動提示功能

在輸入框中輸入我們想要輸入的資訊就會出現其他與其相關的提示資訊,這種效果在Android中是用AutoCompleteTextView實現的


主要實現程式碼

MainActivity

package com.example.happydictionary;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import com.example.happydictionary.adapter.DictionaryAdapter;
import com.example.happydictionary.db.DBHelper;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener,
		TextWatcher {
	private DBHelper dbHelper; // 使用者輸入文字框
	private AutoCompleteTextView word; // 定義資料庫的名字
	private SQLiteDatabase database;
	private Button searchWord; // 搜尋按鈕
	private TextView showResult; // 使用者顯示查詢結果

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		dbHelper = new DBHelper(getBaseContext());// 開啟資料庫
		database = dbHelper.openDatabase();

		init();

		searchWord.setOnClickListener(this); // 繫結監聽器
		word.addTextChangedListener(this); // 繫結文字改變監聽器

	}

	public void init() {
		searchWord = (Button) findViewById(R.id.btnSearch);
		word = (AutoCompleteTextView) findViewById(R.id.etWord);
		showResult = (TextView) findViewById(R.id.tvSearchResult);

	}

	public void afterTextChanged(Editable s) {
		Cursor cursor = database.rawQuery(
				"select english as _id from t_words where english like ?",
				new String[] { s.toString() + "%" });
		
		// 新建新的Adapter
		DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this,cursor, true);
		
		// 繫結介面卡
		word.setAdapter(dictionaryAdapter);

	}

	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {

	}

	public void onTextChanged(CharSequence s, int start, int before, int count) {

	}

	public void onClick(View view) {
		// 查詢指定的單詞
		String sql = "select chinese from t_words where english=?";
		
		Cursor cursor = database.rawQuery(sql, new String[] { word.getText()
				.toString() });
		
		String result = "查無該詞"; // 如果查詢單詞,顯示其中文的意思
		
		if (cursor.getCount() > 0) { 
			
			cursor.moveToFirst(); // 須使用moveToFirst方法將記錄指標移動到第1條記錄的位置
			result = cursor.getString(cursor.getColumnIndex("chinese"))
					.replace("&", "&");
		}

		showResult.setText(word.getText() + "\n" + result.toString());// 將結果顯示到TextView中
	}

}

DictionaryAdapter
package com.example.happydictionary.adapter;

import com.example.happydictionary.R;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

//自定義Adapter類
public class DictionaryAdapter extends CursorAdapter {
	private LayoutInflater layoutInflater;

	@Override
	public CharSequence convertToString(Cursor cursor) {
		return cursor == null ? "" : cursor.getString(cursor
				.getColumnIndex("_id"));
	}

	// 將單詞資訊顯示到列表中
	private void setView(View view, Cursor cursor) {
		TextView tvWordItem = (TextView) view;
		tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));
	}

	// 繫結選項到列表中
	@Override
	public void bindView(View view, Context context, Cursor cursor) {
		setView(view, cursor);
	}

	// 生成新的選項
	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent) {
		View view = layoutInflater.inflate(R.layout.word_list_item, null);
		setView(view, cursor);
		return view;
	}

	public DictionaryAdapter(Context context, Cursor c, boolean autoRequery) {
		super(context, c, autoRequery);
		layoutInflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
}
WordDao
package com.example.happydictionary.dao;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.happydictionary.db.DBHelper;

public class WordDao {
	 private DBHelper dbHelper;
	 private SQLiteDatabase sqLiteDatabase;
	 public WordDao(Context context){
		 dbHelper=new DBHelper(context);
	 }
     public String getChinese(String english){
    	 sqLiteDatabase=dbHelper.openDatabase();
    	 String sql="select chinese from t_words where english=?";
    	 Cursor cursor=sqLiteDatabase.rawQuery(sql, new String[]{english});
    	 String chinese="查無該詞";
    	 if(cursor.moveToFirst()){
    		 chinese=cursor.getString(cursor.getColumnIndex("chinese"));
    	 }
    	 return chinese;
     }
}
DBHelper
package com.example.happydictionary.db;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.example.happydictionary.R;
import com.example.happydictionary.R.raw;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;

/**
 * 實現將資料庫檔案從raw目錄拷貝到手機裡存放資料庫的位置
 * 
 * @author cabbage
 */
public class DBHelper {
	private final int BUFFER_SIZE = 400000;
	public static final String DB_NAME = "idiom.db"; // 儲存的資料庫檔名
	public static final String PACKAGE_NAME = "com.example.happydictionary";// 應用的包名
	public static final String DB_PATH = "/data"
			+ Environment.getDataDirectory().getAbsolutePath() + "/"
			+ PACKAGE_NAME + "/databases";
	/*// SDCard 定義資料庫的存放路徑
	private final String DATABASE_PATH = android.os.Environment
			.getExternalStorageDirectory().getAbsolutePath() + "/dictionary";*/

	private Context context;

	public DBHelper(Context context) {
		this.context = context;
	}

	public SQLiteDatabase openDatabase() {
		try {
			File myDataPath = new File(DB_PATH);
			if (!myDataPath.exists()) {
				myDataPath.mkdirs();// 如果沒有這個目錄則建立
			}
			String dbfile = myDataPath + "/" + DB_NAME;
			if (!(new File(dbfile).exists())) {// 判斷資料庫檔案是否存在,若不存在則執行匯入,否則直接開啟資料庫
				InputStream is = context.getResources().openRawResource(
						R.raw.dictionary); // 欲匯入的資料庫
				FileOutputStream fos = new FileOutputStream(dbfile);
				byte[] buffer = new byte[BUFFER_SIZE];
				int count = 0;
				while ((count = is.read(buffer)) > 0) {
					fos.write(buffer, 0, count);
				}
				fos.close();
				is.close();
			}
			SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
					null);
			return db;
		} catch (FileNotFoundException e) {
			Log.e("Database", "File not found");
			e.printStackTrace();
		} catch (IOException e) {
			Log.e("Database", "IO exception");
			e.printStackTrace();
		}
		return null;
	}
}

word
package com.example.happydictionary.entity;

public class Word {
	private String english;
	private String chinese;

	public String getEnglish() {
		return english;
	}

	public void setEnglish(String english) {
		this.english = english;
	}

	public String getChinese() {
		return chinese;
	}

	public void setChinese(String chinese) {
		this.chinese = chinese;
	}

}
activity_main.xml
<RelativeLayout 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:background="@drawable/mainbg"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <Button
        android:id="@+id/btnSearch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/etWord"
        android:layout_alignBottom="@+id/etWord"
        android:layout_marginLeft="16dp"
        android:layout_toRightOf="@+id/etWord"
        android:background="@drawable/ibsearchword"
        android:onClick="searchWord"
        android:text="@string/serachWord" />

    <TextView
        android:id="@+id/tvSearchResult"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignLeft="@+id/etWord"
        android:layout_below="@+id/etWord"
        android:layout_marginTop="22dp"
        android:textSize="25sp"
        android:background="@drawable/bg_roundcorner"
        android:textAppearance="?android:attr/textAppearanceMedium" />

       <AutoCompleteTextView
        android:id="@+id/etWord"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="31dp"
        android:background="@android:drawable/edit_text"
        android:ems="10"
        android:hint="@string/searchHint"
        android:singleLine="true"
        android:textColor="#552006"
        android:textColorHint="#782f10" />

</RelativeLayout>
word_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tvWordItem"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:paddingLeft="6dip"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@color/gray" />


相關推薦

利用AutoCompleteTextView連線資料庫實現自動提示功能

在輸入框中輸入我們想要輸入的資訊就會出現其他與其相關的提示資訊,這種效果在Android中是用AutoCompleteTextView實現的 主要實現程式碼 MainActivity package com.example.happydictionary; import

原生js利用圖靈機器人實現自動回覆功能

HTML程式碼: <style type="text/css"> * { padding: 0; margin: 0; } .imgLayout { width: 100%; height: 100%; margin: 0 auto;

solr-利用suggest新增Solr中自動提示功能的簡介

suggest 是搜尋引擎一個方便的功能,對資料的關鍵字進行預測和建議,減少了使用者的輸入,大體的效果如下: 幸運的是 solr 也提供了類似的功能,在該功能的基礎上,配合 jQuery 或 kissy 的自動完成元件就可以實現類似上面的功能。 啟動該功能的過程大體如下: suggest 的功能依賴拼寫元件

java利用jdbc連線Mysql資料庫——實現登入註冊功能

實現功能如下: ①0選中註冊,若使用者名稱相同則註冊失敗,重新選擇 ②若使用者名稱不存在則儲存到資料庫 ③1選中登入,若使用者名稱和密碼符合時,登入成功。 程式碼如下: package com.lucfzy; import java.sql.Connection; imp

利用spket外掛讓Myeclipse中Jquery自動提示功能

Spket ide是強大的工具包為了JavaScript和XML的開發,這個強大的編輯器對JavaScript, XUL/XBLand Yahoo! Widget的開發都有全面的支援 ,例如程式碼完成,語法高亮和內容概要,幫助開發有成效,創造高效率的javascript程式碼。 小巧的身軀,強大

java連線MySql資料庫 實現使用者登入功能

一: 準備工作        1.首先將MySql的jar包匯入專案檔案中,在進行連線。(Build path--> Add)        2.寫好配置檔案(dbinfo.properties)        3.               4.建立相應的類進行。二

Eclipse新增DTD檔案實現xml的自動提示功能

以iBATIS編寫 Sql Map Config 配置檔案為例, 新增 sql-map-config-2.dtd 到Eclipse中, 從而獲得xml自動的提示的功能, 能更好的按照iBATIS官方定義的規範來編寫xml文件.    記住xml中有這麼一句話. <

網頁中文字框下拉選擇輸入與自動提示功能實現

         在網頁設計中我們經常需要使用者進行輸入操作,下面我分享兩種使用者的輸入功能。        1.輸入框自動提示         瀏覽網頁的時候我們經常會遇到輸入框內我們輸入前幾個字,

Eclipse使用(七)—— 使用Eclipse建立JavaWeb專案並使用JDBC連線資料庫實現簡單的登陸註冊功能

一、建立資料庫表(這裡使用的是Mysql5.7) DDL語句如下: CREATETABLE `tb_user` (     `u_id` int(11) NOTNULL AUTO_INCREMENT COMMENT '使用者編號',     `u_username

AutoCompleteTextView輸入框自動提示功能

public class SuggestPoiAdapter extends BaseAdapter implements Filterable { private static final int ITEM_BAIDU = 0; private static final int CLOSE_

利用過濾器(Filter)實現自動登入功能

        思路:登入成功儲存登入時Cookie以及Session,下次開啟網站通過過濾器攔截檢視Session是否存在使用者(考慮使用者沒有關閉瀏覽器的情況),如果Session中有使用者資料,放行,從Cookie中查詢使用者資料如果沒有資料,放行。         具

jQuery實現自動提示,分類選擇等功能的搜尋框

//初始條件 //高亮 var highLight={ 'background-color':'#0099FF', 'color':'white' } //預設亮度

利用shell腳本實現計劃任務功能 V1.2

target 無需重啟 控制 basedir 之間 集中 shell腳本 htm 方便 2013.05.10 mytask 1.2   主程序休眠時間分成若幹小的時間片斷分段休眠,避免長時間的休眠不能及時響應系統信號。 2013.05.07 mytask 1

idea沒有代碼自動提示功能和包自動引入不了問題

功能 自動 pow idea mage -1 header 原因 技術 idea沒有代碼自動提示功能和包自動引入不了問題 原因:節電模式 File -> Power Save Mode (被勾選了) 處理方法: File -> Power Save Mode (

增強MyEclipse的代碼自動提示功能

win 才會 hot 版本 db4 out cdd 路徑 6.5 一般在Eclipse ,MyEclipse代碼裏面,打個foreach,switch等 這些,是無法得到代碼提示的(不信自己試試),其他的就更不用說了,而在Microsoft Visual

QGIS在ANDRIOD上利用高德API實現道路導航功能

qgisQGIS在ANDRIOD上利用高德API實現道路導航功能

利用jquery的contains實現搜索功能

sea clas .sh 搜索功能 display fun != ont 搜索 1 / jquery實現的搜索功能 2 $(‘#search_btn‘).on(‘click‘,function(){ 3 var txt=$(‘#inputVa

laydate點擊月份實現自動關閉功能

laydate<pre> laydate.render({ elem:‘#settleMonth‘, type:‘month‘, format:‘yyyy-MM‘, showBottom:false, ready:function(date){

利用saltstack的event實現自己的功能

compile another std 分析 roc 利用 其中 The AC saltstack的master上minion連接較多,下面這個程序可以分析哪些minion任務執行成功,哪些執行失敗以及哪些沒有返回。 腳本說明: 一、最先打印出本次任務的job id、c

c# wpf 利用截屏鍵實現截屏功能

aging psc 獲取圖片 print href bits ng2 ont 包裝 原文:c# wpf 利用截屏鍵實現截屏功能 ? ? 最近做一個wpf程序需要截圖功能,查找資