AutoCompleteTextView使用中的注意事项

        在之前的一篇文章当中,介绍了如何使用AutoCompleteTextView按照关键字从服务器上获得数据显示下拉列表。博主也是按照文中的思想在项目开发当中实际运作,使用效果不错,客户见了之后直呼效果很好。但是最近团队中其他人在使用时遇到一头痛的BUG,博主调试了半个小时才调试出来,在这里把BUG和解决方法贴出来,大家参考。

一、功能介绍:

        在使用AutoCompleteTextView按照关键字从服务器上获得人员信息JSON数据,并把JSON数据中人员名称显示在下来列表中,当用户选中下拉列表中的Item时,需要将选中的Item中从List中取出来,保存下来,以备后面使用。这就相当于一个新闻列表,我选中新闻时进入新闻的详细信息的操作。只不过这里是将选中的Item中的一部分值放入AutoCompleteTextView,将其他信息保存下来。

        如下图,我有可能选中中国气象局,然后将其详细信息保存当javabean中。


二、错误的实现

        错误现象:当我们选中上面的“中国气象局”的时候,其所对应的Item信息没有存放到对应的Javabean中。
package com.yang.testautocompletetextview;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

/**
 * @Title: WikiSuggestActivity.java
 * @Package com.yang.testautocompletetextview
 * @Description: 
 *               参考http://stackoverflow.com/questions/8653260/autocomplete-in-android
 *               -not-working-with-dynamic-data
 * @author Yang zhilong
 * @date 2012-8-12 下午2:59:54
 * @version V1.0
 */
public class WikiSuggestActivity extends Activity {
	public String data;
	public List suggest;
	public AutoCompleteTextView autoComplete;
	public ArrayAdapter aAdapter;

	private static final String TAG = "WikiSuggestActivity";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		suggest = new ArrayList();
		autoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
		autoComplete.setOnItemClickListener(itemClickListener);
		autoComplete.addTextChangedListener(new TextWatcher() {

			public void afterTextChanged(Editable editable) {

			}

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

			}

			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
				String newText = s.toString();
				new getJson().execute(newText);
			}

		});
	}

	OnItemClickListener itemClickListener = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView parent, View view, int position,
				long id) {
			int key = parent.getId();//错误发生在这里
			Log.d(TAG, "key is " + key + " and R.id.autoCompleteTextView1 is "
					+ R.id.autoCompleteTextView1);
			switch (key) {
			case R.id.autoCompleteTextView1:
				Log.d(TAG, "I am magic in place!");
				break;
			}

		}

	};

	class getJson extends AsyncTask {

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			aAdapter = new ArrayAdapter(getApplicationContext(),
					R.layout.item, suggest);
			autoComplete.setAdapter(aAdapter);
			aAdapter.notifyDataSetChanged();
		}

		@Override
		protected String doInBackground(String... key) {
			String newText = key[0];
			newText = newText.trim();
			newText = newText.replace(" ", "+");
			try {
				HttpClient hClient = new DefaultHttpClient();
				HttpGet hGet = new HttpGet(
						"http://en.wikipedia.org/w/api.php?action=opensearch&search="
								+ newText + "&limit=8&namespace=0&format=json");
				ResponseHandler rHandler = new BasicResponseHandler();
				data = hClient.execute(hGet, rHandler);
				suggest = new ArrayList();
				JSONArray jArray = new JSONArray(data);
				for (int i = 0; i < jArray.getJSONArray(1).length(); i++) {
					String SuggestKey = jArray.getJSONArray(1).getString(i);
					suggest.add(SuggestKey);
				}

			} catch (Exception e) {
				Log.w("Error", e.getMessage());
			}
			return null;
		}

	}
}
打印字符串如下:
10-25 20:06:28.830: D/WikiSuggestActivity(2155): key is -1 and R.id.autoCompleteTextView1 is 2131230720
于是乎下面的代码
OnItemClickListener itemClickListener = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView parent, View view, int position,
				long id) {
			int key = parent.getId();//错误发生在这里
			Log.d(TAG, "key is " + key + " and R.id.autoCompleteTextView1 is "
					+ R.id.autoCompleteTextView1);
			switch (key) {
			case R.id.autoCompleteTextView1:
				Log.d(TAG, "I am magic in place!");
				break;
			}

		}

	};
便永远执行不到。这也就导致了其所对应的Item信息没有存放到对应的Javabean中。
错误的具体原因是,parent.getId()所得到的是对应View的id,而其所对应的View是一个listview,而这个listview没有在我们的R文件当中注册,它是系统自带的一个组件,而不是我们这里的 R.id.autoCompleteTextView1。因此也就发生了以上悲剧。

三、解决方案

去掉switch case代码,直接进行Javabean的赋值操作。




你可能感兴趣的:(Android)