AutoCompleteTextView按照关键字从服务器上获得数据显示下拉列表

最近项目原因,需要做出一个类似baidu搜索时下拉框的效果如图

于是乎想了多种办法,一种是利用AutoCompleteTextView+ListView方式,但是这种方式有一个缺点就是需要用帧布局,同时在利用AutoCompleteTextView.addTextChangedListener方法控制ListView的显示和消失时遇到一个很大的问题就是无法让其消失,即使你选中了一个条目,因为TextChanged的原因,ListView也是以一条你选中的条目为显示内容的形式在AutoCompleteTextView的下方,没有找到好的解决办法。

之所以想到以上这种办法的原因是在项目的一开始没有使用AutoCompleteTextView的原生态的下拉列表(有各种各样的不更新造成的),后来在使用AutoCompleteTextView+ListView无效的情况下只能回到AutoCompleteTextView的原生态的下拉列表的方法上。

http://stackoverflow.com/tags/autocompletetextview/hot这是stackoverflow上关于AutoCompleteTextView的FAQ,从中我们可以看到有多个关于从网上获取条目然后显示在AutoCompleteTextView的列表之上的问题和相应的回答。最终选中了http://stackoverflow.com/questions/8653260/autocomplete-in-android-not-working-with-dynamic-data这个问题当中名为iNan的解答,并对其进行了改进。

具体代码如下

WikiSuggestActivity

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.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  
 * @date 2012-8-12 下午2:59:54
 * @version V1.0
 */
public class WikiSuggestActivity extends Activity {
	public String data;
    public List<String> suggest;
    public AutoCompleteTextView autoComplete;
    public ArrayAdapter<String> aAdapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        suggest = new ArrayList<String>();
        autoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
        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);
            }

        });

    }
   class getJson extends AsyncTask<String,String,String>{

    @Override
	protected void onPostExecute(String result) {
		super.onPostExecute(result);
		 aAdapter = new ArrayAdapter<String>(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<String> rHandler = new BasicResponseHandler();
            data = hClient.execute(hGet,rHandler);
            suggest = new ArrayList<String>();
            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;
    }

   }
}
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" >

    <AutoCompleteTextView
        android:id="@+id/autoCompleteTextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:ems="10" />
    <!-- android:ems  设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度 -->

</RelativeLayout>
item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" 
android:layout_height="wrap_content"  
android:id="@+id/online_user_list_item_textview" >
</TextView>
效果图如下:



整个项目代码下载地址


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值