AutoCompleteTextView OnItemClickListener не работает

#android #autocompletetextview

#Android #autocompletetextview

Вопрос:

Сегодня у меня есть конкретный вопрос, и я искал в Google, но не смог найти ответа, который мог бы помочь.

Моя активность имеет AsyncTask, которая загружает некоторые строки из базы данных и показывает их в autocompletetextview. Я использую HttpURLConnection для получения строк, затем анализирую их с помощью библиотеки json-simple, а затем показываю их в autocompletetextview. Вот весь код для ACTV, который находится в onPostExecute():

 ArrayList<Object> result = new ArrayList<>();
for (Shift_OneTime sot : shifts) {
     result.add(sot.getName()   " "   sot.getDay()   " "   sot.getMonth()   " "   sot.getYear());
     }
     for (Employee e : emps) {
         result.add(e.toString());
     }

     acs = (AutoCompleteTextView) findViewById(R.id.autocompletesearch);

     ArrayAdapter<Object> adapter = new ArrayAdapter<>(MainScreen.this, android.R.layout.simple_list_item_1, result);
     acs.setAdapter(adapter);
     acs.setOnItemClickListener(new AdapterView.OnItemClickListener() {
          @Override
          public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
               acs.setText("");
               acs.clearFocus();
               Object o = adapterView.getItemAtPosition(i);
               if (o instanceof Employee) {
                  Intent n = new Intent(MainScreen.this, EmployeeDetailsActivity.class);
                  n.putExtra("employeeid", ((Employee) o).getId());
                  startActivity(n);
                } else if (o instanceof Shift_OneTime) {
                  Intent n = new Intent(MainScreen.this, ShiftDetailsActivity.class);
                  n.putExtra("shiftid", ((Shift_OneTime) o).getId());
                  startActivity(n);
                }
           }
      });
  

Я получаю эту кучу предупреждений:

 W/IInputConnectionWrapper: getSelectedText on inactive InputConnection
W/IInputConnectionWrapper: requestCursorAnchorInfo on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
  

Эти ошибки появляются, когда я нажимаю на строку, которая появляется после ввода чего-либо в autocompletetextview. Теперь мое наблюдение не является точным, но в прошлый раз, когда оно работало, я использовал старый DefaultHttpClient или что-то еще, что теперь устарело. Именно по этой причине я перешел на HttpURLConnection. После этого изменения я также переместил ACTV в AsyncTask, поскольку я читаю строки из моего веб-сервиса php, а также добавил ActionBarDrawerToggle и переопределил его методы, чтобы программная клавиатура скрывалась, когда я открываю панель навигации.

Я попытался удалить расширенный переключатель, а также попытался вернуть OnItemClickListener() обратно за пределы AsyncTask, но это не помогло. Я не могу сейчас вернуться к устаревшему HTTP-клиенту, поэтому я хотел бы знать, есть ли у кого-нибудь какие-либо идеи… Большое спасибо

Ответ №1:

вам нужно использовать setOnClickListener ();

Комментарии:

1. нет, setOnClickListener реагирует при нажатии на ACTV. Это не то, чего я хочу

2. ур отсутствуют, и еще просто, чтобы убедиться, что вы получаете правильные вещи

3. у меня это было раньше, и ни один из ifs не был обработан, но это еще было

Ответ №2:

Проблема, которую я не заметил, заключается в том, что Object o = adapterView.getItemAtPosition(i); я получал объект типа String (обратите внимание на то, как я заполняю список результатов), ни объект Employee, ни Shift_OneTime . Поэтому, когда я проверил, есть ли ‘o instanceof XXX’, это не было ни тем, ни другим. Поэтому вместо заполнения списка строками мне пришлось вставлять сами объекты, например: Before:

 result.add(sot.getName()   .... );
  

После:

 result.add(e);
  

Поиск символов в ACTV выполняется с использованием значений в методе toString() в классах Employee и Shift_OneTime.

Надеюсь, это поможет кому-то в будущем.

Ответ №3:

Я много чего перепробовал и нашел это решение

Я сделал это решение, когда Onclicklistener не работал над моим кодом

Поместите Onclicklistener в свой пользовательский адаптер в getView().

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Customer customer = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.customer_row, parent, false);
        }
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(yourContext, "text clicked", Toast.LENGTH_SHORT).show();
            }
        });

//....do your stuff here 

        return convertView;
    }