项目开发之需要, 根据用户拼音或代码检索出用户信息. 现在有两种方法可以实现.
1. 使用android系统自带组件: AutoCompleteTextView .
效果图如下:
布局文件:
auto_textview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/selection6" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <AutoCompleteTextView android:id="@+id/editAuto" android:layout_width="fill_parent" android:layout_height="wrap_content" android:completionThreshold ="1" /> </LinearLayout>
2. java代码:
public class AutoComplementTest extends Activity {
private AutoCompleteTextView edit;
private String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.auto_textview);
edit = (AutoCompleteTextView)findViewById(R.id .editAuto);
//步骤1:设置适配器
edit.setAdapter (new ArrayAdapter<String>(this ,android.R.layout.simple_dropdown_item_1line ,items ));
}
}
此法的弊端: 不能根据字母拼音或代码检索, 只能根据返回的值自动补全, 拓展性不全.
方法二:
EditText和ListView组合成类似自动补全功能.
效果图如下:
布局文件代码:
<EditText android:id="@+id/edit_key" android:layout_width="fill_parent" android:layout_height="32dip" android:layout_marginLeft="2dip" android:layout_marginTop="4dip" android:layout_marginBottom="4dip" android:paddingTop="8dip" android:paddingBottom="4dip" android:focusable="false" android:layout_marginRight="12dip" android:background="@drawable/qt_search_txt" /> <ListView android:id="@+id/lstv_all" android:layout_width="fill_parent" android:layout_height="wrap_content" />
java代码:
public class LoadableStockListActivity extends ListActivity{
private StringBuffer sb = new StringBuffer();
private EditText txtKey;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.loadable_stock_list_activity);
foursquared = ((Foursquared)this.getApplication());
mEmptyProgress = (ProgressBar) findViewById(R.id.emptyProgress);
mEmptyText = (TextView) findViewById(R.id.emptyText);
setLoadingView();
txtKey = (EditText)findViewById(R.id.edit_key);
listView = (ListView)findViewById(R.id.lstv_all);
//添加文本改变事件
txtKey.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
key = txtKey.getText().toString();
if(key!=null && !"".equals(key.trim())){
Log.i(TAG , " key:"+key);
List<Map<String , String>> lst = foursquared.getSelectStock(key);//根据关键字查询股票代码
StockListAdapter stockAdapter = new StockListAdapter(LoadableStockListActivity.this , lst);
listView.setAdapter(stockAdapter);
}else{
listView.setAdapter(null);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
//查询所有股票相关数据
List<Map<String , String>> lst = foursquared.getSelectStock(null);
//自定义ListView适配器
StockListAdapter stockAdapter = new StockListAdapter(this , lst);
//设置适配器
listView.setAdapter(stockAdapter);
}
getSelectStock()方法详解:
/**
* 获取股票代码信息列表
* @return
*/
public List<Map<String , String>> getSelectStock(String key){
stockDB.open();
List<Map<String , String>> stocks = stockDB.selectStock(key);
stockDB.close();
return stocks;
}
selectStock()方法详解:(欲了解stockDB具体代码,请参考: 上篇:android开发笔记-sqllite操作)
public List<Map<String , String>> selectStock(String key){
if(!db.isOpen()){
db = dbHelper.getReadableDatabase();
}
List<Map<String , String>> stockList = new ArrayList<Map<String , String>>();
Cursor cur = null;
if(null!=key && !"".equals(key)){
//查询的列字段名
String [] columns = {CODE , NAME , SIMPLE};
//查询条件
String where = CODE+ " like ? or "+NAME+" like ? or "+SIMPLE+" like ? ";
//查询参数
String [] selectArgs = {key+"%" , key+"%" , key+"%"};
//执行查询
cur = db.query(DATABASE_TABLE, columns, where , selectArgs, null, null, null);
cur.moveToFirst();
//循环读取数据
while(!cur.isAfterLast()){
Map<String , String> stockMap = new HashMap<String , String>();
String code = cur.getString(0);
String name = cur.getString(1)+"("+code+")";
stockMap.put("code" , code);
stockMap.put("name" , name);
stockList.add(stockMap);
cur.moveToNext();
}
cur.close();
close();
return stockList;
}
return null;
}
此方法能够根据股票代码, 拼音字母检索股票信息