AutoCompleteTextView使用探索

为了实现和google一样的关键字搜索,我选择使用AutoCompleteTextView这个组件,使用过程历经坎坷,最后完成。

一、需要

        我做的应用是在输入框输入关键字,然后连接服务器,在服务器端根据关键字查询,得到一个xml文件,然后我得到进行解析!

二、主要代码

		act_input_school.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO 自动生成的方法存根	
				new GetPromptInfoTask().execute();				
			}
			
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO 自动生成的方法存根	
				
			}
			
			@Override
			public void afterTextChanged(Editable s) {
				// TODO 自动生成的方法存根
				
			}
		});

这段是添加监听,在onTextChanged中使用异步工具,连接网络,获得数据,然后解析

		@Override
		protected QueryResult<SchoolInfo> doInBackground(Void... params) {
			// TODO 自动生成的方法存根
			HashMap<String, String> pairs = new HashMap<String, String>();		
			pairs.put(SoufunConstants.MWSSAGE_NAME,"xuexiao");
			pairs.put("xuexiao", act_input_school.getText().toString());
			try {
				return HttpApi.getQueryResultByPullXml(pairs, "school", SchoolInfo.class);
			} catch (Exception e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			
			return null;
		}	

这里获得一个对象,对象中存储一个list保存所有学校信息

		protected void onPostExecute(QueryResult<SchoolInfo> result) {
			// TODO 自动生成的方法存根
			ArrayAdapter<String> promtAdapter = null;
			if (result !=null){
				 schoolList = result.getList();
				if(schoolList!=null&&schoolList.size()>0){	
					promtAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_dropdown_item_1line);					
					for(SchoolInfo tempSchoolInfo:schoolList){
						promtAdapter.add(tempSchoolInfo.name);
					}					
				}
				act_input_school.setAdapter(promtAdapter);
                                //下边这两行应该是红色的可是显示不出来
                                if(act_input_school.getText().toString().length()>0)
					act_input_school.showDropDown();
			}else{
			}
			if(promtAdapter != null)
				Toast.makeText(mContext, "数据源中有"+promtAdapter.getCount()+"条数据~~~~~~~"+act_input_school.isPopupShowing(), 0).show();
		}
在onPostExecute中新建一个adapter,然后把数据存进去,红色的部分是关键,当输入框长度大于0的时候强行显示下拉列表。或许有人问我,这部是不是多余,对于AutoCompleteTextView来说会自动显示下拉列表框,不是这样的。下面说下我遇到的两个问题。

三、问题

        1、总是从输入第二个字符开始出现下拉列表,后来才发现自己犯了一个低级错误,因为AutoCompleteTextView默认是从输入第二个字符开始自动匹配的,可以在xml使用    android:completionThreshold="1"    这个属性,或者动态设置    act_input_school.setThreshold(1)   

        2、第二个问题,就是第一次输入的时候,不管你输入几个字符,都不会出现下拉框,尽管我已经设置了从第一个字符开始匹配,但是还是不行,因为我检查过,网络确实获得了数据,已经设置进入adapter中,可是就是显示不出来,这里只限第一次输入,如果第一次输入“北”,应该把带有这个关键字的所有大学都显示出来,可是不成,我Toast了一下,发现adapter中有63条数据,很显然没显示出来,然后输入“京”,这时候变成“北京”,会出现下拉框,如果把北京删掉,从新输入“”,会出现下拉框,我去,这不是玩我嘛!!后来我看了下源码,如下

    public void showDropDown() {
        buildImeCompletions();

        if (mPopup.getAnchorView() == null) {
            if (mDropDownAnchorId != View.NO_ID) {
                mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId));
            } else {
                mPopup.setAnchorView(this);
            }
        }
        if (!isPopupShowing()) {
            // Make sure the list does not obscure the IME when shown for the first time.
            mPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED);
            mPopup.setListItemExpandMax(EXPAND_MAX);
        }
        mPopup.show();
        mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);
    }

这应该是显示下拉菜单的,所以我就加入了上边红色的部分,强制显示下拉框,问题才得到解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千面而一言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值