现在的位置: 首页 > 综合 > 正文

AutoCompleteTextView 自动提示输入 Android访问WCF服务(上篇)-服务端开发Android访问WCF(下篇)-客户端开发Android用GSon处理Json数据

2013年08月25日 ⁄ 综合 ⁄ 共 3407字 ⁄ 字号 评论关闭

 在我们平常上网的时候经常会用到谷歌或百度,在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,非常方便。这种效果在Android中是用AutoCompleteTextView实现的:
  AutoCompleteTextView是一个可编辑的文本视图显示自动完成建议当用户键入。建议列表显示在一个下拉菜单,用户可以从中选择一项,以完成输入。建议列表是从一个数据适配器获取的数据。它有三个重要的方法clearListSelection():清除选中的列表项、dismissDropDown():如果存在关闭下拉菜单、getAdapter():获取适配器。我们要这样实例化一下适配器
  ArrayAdapteradapter=newArrayAdapte(this,android.R.layout.simple_dropdown_item_1line,strs);
strs是一个String数组,String [] strs = new String{""};

效果图:

1,普通的AutoCompleteTextView

先看布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
<AutoCompleteTextView 
	android:id="@+id/edit"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"/>
</LinearLayout>

布局文件里只有一个AutoCompleteTextView控件。

下面看代码

public class AutoComplete extends Activity {
	
	AutoCompleteTextView autoview;
	
	ArrayAdapter<String> adapter;
	
	//default city
	String[] city = {
			"上海市","北京市","天津市","武汉市","四川省"
	};
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);   
        intialView();
        /**设置字符数*/
        autoview.setThreshold(1);        
    }

    /**初始化AutoCompleteTextView*/
    public void intialView(){
    	adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, city);
    	
    	autoview = (AutoCompleteTextView) findViewById(R.id.edit);
    	autoview.setWidth(200);
    	/**设置适配器*/
    	autoview.setAdapter(adapter);
    }
}

这里设置字符数为1,默认是2,当你在控件里输入一个字符后,就可以自动提示了。

2,和数据库交互,实时动态显示

上面的例子strs数组是固定不变的,现实情况是它是随时会改变的,比如我们企业名称,数据库里有好几百万条,甚至更多的数据。我们总不能加载的时候就全部查询出来,然后赋值给string数组吧!我们看AutoCompleteTextView控件,你只需要给它设置了一个Adapter就可以了,而Adapter是与这个String数组相关的,所以我们想到实时的修改String数组里的数据就Ok了。下面请看我写的代码,与大家分享一下。如果有什么不足或者您有更好的建议,请不佞赐教,谢谢!

布局文件和上面的布局文件一样

代码:这里使用WCF访问数据库的代码没有写出来,大家可以参考我的博客

Android访问WCF服务(上篇)-服务端开发

Android访问WCF(下篇)-客户端开发

Android用GSon处理Json数据

这里只是一个思路。

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class AutoComplete extends Activity {

	AutoCompleteTextView autoview;

	ArrayAdapter<String> adapter;

	// default city
	String[] city = { "上海市", "北京市", "天津市", "武汉市", "四川省" };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		intialView();
		/** 设置字符数 */
		autoview.setThreshold(1);

		// Button btn = (Button)findViewById(R.id.button);
		// btn.setOnClickListener(new OnClickListener(){
		// public void onClick(View v) {
		// // TODO Auto-generated method stub
		// String string = autoview.getText().toString();
		// adapter.add(string);
		// }
		// });
	}

	/** 初始化AutoCompleteTextView */
	public void intialView() {
		adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_dropdown_item_1line, city);

		autoview = (AutoCompleteTextView) findViewById(R.id.edit);
		autoview.setWidth(200);
		/** 添加文本改变的监听 */
		autoview.addTextChangedListener(watcher);
		/** 设置适配器 */
		autoview.setAdapter(adapter);
	}

	private TextWatcher watcher = new TextWatcher() {
		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {
		}

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

		@Override
		public void afterTextChanged(Editable s) {
			if (s.length() == 2) {
				/**初始化访问WCF服务的工具类*/
				WcfServer wcf = new WcfServer();
				/** 这里使用访问WCF服务去获取数据库的信息 */
				String res = wcf.wcfServer(s.toString());
				/**返回的企业信息是用"|"分隔的字符串*/
				String [] strs = res.split("\\|");
				/**清空adapter适配器*/
				adapter.clear();
				/**填充*/
				for(String comName : strs){
					adapter.add(comName);
				}
			}
		}
	};
}

 

抱歉!评论已关闭.