AutoCompleteTextView обнаруживает, если пользователь выбрал предложение - PullRequest
1 голос
/ 15 ноября 2011

Я бы не хотел, чтобы пользователь мог нажимать на кнопку, только если он нажал предложение из моего autocompleteTextview.

Для этого я реализовал onKeyListener im мой адаптер и удалил тег, которыйбыл установлен адаптером, если вы нажали предложение.Затем я проверил, был ли тег.

Но 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;
    }
}

Есть ли другой способ решения этой проблемы?

Ответы [ 3 ]

8 голосов
/ 09 декабря 2011

Глядя на ваш код:

  • 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);
        }
    });
6 голосов
/ 11 декабря 2011

Вы можете использовать метод setOnClickListner для автозаполнения текстового представления. Слушатель выбранного элемента будет срабатывать, когда элемент списка приобретает фокус, а не при щелчке (выделении) элемента.

//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);
    }
};

Надеюсь, это поможет ..

0 голосов
/ 07 декабря 2011

Хм, не понимаю, почему вы используете тег. Возможно, мне не хватает ограничений. В противном случае, я думаю, что это то, что вы собираетесь:

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


});
...