【问题标题】:AutoCompleteTextView detect if user choosed suggestionAutoCompleteTextView 检测用户是否选择了建议
【发布时间】:2011-11-15 10:49:52
【问题描述】:

我只希望用户在按下我的 autocompleteTextview 的建议后才能点击按钮。

为了实现这一点,我在我的适配器中实现了一个 onKeyListener,并在您按下建议时删除了适配器设置的标签。然后我检查是否有标签。

但是 onKeyListener 似乎没有正确移除标签:

public class StopCursorAdapter extends CursorAdapter{

    private Context context;
    private LayoutInflater inflater;
    private AutoCompleteTextView autoCompleteTextView;

    public StopCursorAdapter(final AutoCompleteTextView autoCompleteTextView, Context context, Cursor c){
        super(context, c);
        this.context = context;
        this.autoCompleteTextView = autoCompleteTextView;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        this.autoCompleteTextView.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event){
                StopCursorAdapter.this.autoCompleteTextView.setTag(null);
                Log.d("cursor", "Removed tag");
                Log.d("cursor", String.valueOf(StopCursorAdapter.this.autoCompleteTextView.getTag() == null));
                Log.d("cursor", String.valueOf(autoCompleteTextView.getTag() == null));         
                return false;
            }
        });
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent){
        View v = inflater.inflate(android.R.layout.two_line_list_item, null);
        return v;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor){
        TextView txt1 = (TextView) view.findViewById(android.R.id.text1);
        TextView txt2 = (TextView) view.findViewById(android.R.id.text2);

        txt1.setTextColor(Color.BLACK);
        txt1.setText(cursor.getString(2));
        txt2.setText(cursor.getString(3));
    }

    @Override
    public CharSequence convertToString(Cursor cursor){
        autoCompleteTextView.setTag(new Stop(cursor.getString(1), cursor.getString(2), cursor
                .getString(3)));
        return cursor.getString(2);// + ", " + cursor.getString(3);
    }

    @Override
    public Cursor runQueryOnBackgroundThread(CharSequence constraint){
        Database.getInstance().ensureLoaded(context);
        String filter = "";
        if(constraint == null){
            filter = "";
        }else{
            filter = constraint.toString();
        }
        Cursor cursor = Database.getInstance().getStopsCursor(filter);
        return cursor;
    }
}

有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: android android-adapter


    【解决方案1】:

    查看您的代码:

    • setTag(new Stop(...)) 是从适配器的 convertToString() 方法调用的,AutoCompleteTextView 在构建选择列表(针对光标中的每一行)以及执行完成时都会调用该方法。我不认为这是你想要的。

    • setTag(null) 是从侦听器的 OnKey() 方法调用的,当用户点击键盘按键时将调用该方法。我也不认为这是正确的。

    我认为正确的代码应该与此类似:

        // set tag to non-null when key is pressed
        autoCompleteTextView.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                autoCompleteTextView.setTag(new Stop());
                return false;
            }
        });
    
        // set tag to null when an item is tapped
        autoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
                autoCompleteTextView.setTag(null);
            }
        });
    

    【讨论】:

      【解决方案2】:

      您可以使用自动完成文本视图的 setOnClickListner 方法。当列表项获得焦点而不是单击(选择)项时,将触发 item selected 侦听器。

      //set on click listener on the auto complete text view
      autoField.setOnItemClickListener(autoItemSelectedListner);
      

      然后,

      private OnItemClickListener autoItemSelectedListner = new OnItemClickListener()
      {
          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
          {
              //extract selected
              selected = adapter.getItem(arg2);
          }
      };
      

      我希望这会有所帮助..

      【讨论】:

        【解决方案3】:

        嗯,它不明白你为什么要使用这个标签。也许我错过了一个约束。 否则,我认为这就是你要追求的:

        autoCompleteTextView.setOnItemSelectedListener(new OnItemSelectedListener() {
          @override
          void public onItemSelected(AdapterView<?> parent, View view, int position, long id) {
             makeSpecialButtonAvailable();
          }
          @override
          void public onNothingSelected(AdapterView<?> parent) {
            //ignore
          }
        
        
        });
        

        【讨论】:

        • 我的应用程序中也有自动完成文本视图,我实现了与您在此处所做的相同的事情,但在选择项目时不会调用 onItemSelected 事件。您知道为什么不调用该方法吗?
        猜你喜欢
        • 2019-05-27
        • 2016-02-29
        • 2013-08-31
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 2011-10-25
        相关资源
        最近更新 更多