OnItemClickListener для нескольких AutoCompleteTextView с отключенным регистром - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть несколько AutoCompleteTextView в макете, поэтому я реализовал AdapterView.OnItemClickListener глобально.

Теперь проблема в том, что

я не могу сравнить AutoCompleteTextView, используя switch регистр внутри слушателя,

Код

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    switch (v.getId()) {
        case R.id.ac_education:
            s_ac_education = testArray[position];
            break;
        case R.id.ac_ethincity:
            s_ac_ethincity = testArray[position];
            break;
        case R.id.ac_languages:
            s_ac_languages = testArray[position];
            break;
        case R.id.ac_location:
            s_ac_location = testArray[position];
            break;
        case R.id.ac_religion:
            s_ac_religion = testArray[position];
            break;
        case R.id.ac_travel:
            s_ac_travel = testArray[position];
            break;
    }
}

Примечание: view.getId() всегда возвращает одно и то же значение, яЯ также пытался if-else, но это тоже не работает. (я уже потратил пару часов)

РЕДАКТИРОВАТЬ

private void init(View v) {
    ac_languages = v.findViewById(R.id.ac_languages);
    ac_religion = v.findViewById(R.id.ac_religion);
    ac_location = v.findViewById(R.id.ac_location);
    ac_travel = v.findViewById(R.id.ac_travel);
    ac_ethincity = v.findViewById(R.id.ac_ethincity);
    ac_education = v.findViewById(R.id.ac_education);
    ptr.setACTVAdapter(getActivity(), ac_education, ac_ethincity, ac_languages, ac_location, ac_religion, ac_travel);

    ac_languages.setHint(R.string.languages);

    ac_religion.setOnItemClickListener(this);
    ac_religion.setHint(R.string.religion);

    ac_location.setOnItemClickListener(this);
    ac_location.setHint(R.string.where_do_you_live);

    ac_travel.setOnItemClickListener(this);
    ac_travel.setHint(R.string.where_can_you_travel);

    ac_ethincity.setOnItemClickListener(this);
    ac_ethincity.setHint(R.string.ethincity);

    ac_education.setOnItemClickListener(this);
    ac_education.setHint(R.string.education);
}

setAdapter (определен в другом классе)

public void setACTVAdapter(Activity activity, AutoCompleteTextView... actv) {
    testArray = activity.getResources().getStringArray(R.array.testArray);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, testArray);
    for (AutoCompleteTextView ac : actv) {
        ac.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}

Спасибо

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Сначала создайте свой пользовательский onItemClickListener:

 public class MyClickListener implements AdapterView.OnItemClickListener {

    AutoCompleteTextView ac;

    public MyClickListener(AutoCompleteTextView myAc){
        ac = myAc;
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        switch(ac.getId()){
            case R.id.autocomplete_1:
                //your code
                break;

            case R.id.autocomplete_2:
                //your code
                break;
        }

    }
}

Используйте его для AutoCompleteTextView:

autoCompleteTextView.setOnItemClickListener(new MyClickListener(autoCompleteTextView));
0 голосов
/ 20 сентября 2018

Согласно официальному документу для AdapterView.OnItemClickListener,

onItemClick() имеют следующие параметры,

parent: AdapterView, в котором произошел щелчок.

view: Представление в AdapterView, по которому был выполнен щелчок (это будет представление, предоставленное адаптером)

position: Позиция представления в адаптере.

id: Идентификатор строки, по которой щелкнули.

Таким образом, вы можете использовать parent вместо view, чтобы получить id этого родителя AutoCompleteTextView.

(отметьте этот ответ, чтобы получить более подробную информацию.)

0 голосов
/ 20 сентября 2018

Отслеживать клики вы хотите не по дочернему элементу, а convertView.

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

public interface OnViewClickListener {
  void onViewClick(View view, int position);
}

Тогда внутри вашего адаптера:

private OnViewClickListener mListener;

public void setOnViewClickListener(final OnViewClickListener listener) {
     mListener = listener;
}

И для каждого ребенка вы хотите:

child.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
           if (mListener != null) {
              mListener.onViewClick(v, position);
           }
        }
});

И с этим вы можете получить клики по элементам:

  adapter.setOnViewClickListener(new OnViewClickListener() {
     @Override
     public void onViewClick(final View view, final int position) {
        ** PUT YOUR SWITCH CASE HERE! **
     }
  });
0 голосов
/ 20 сентября 2018

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

Вместо этого получите экземпляр для каждого представления по их идентификатору на public View getView(int position, View convertView, ViewGroup parent)метод вашего адаптера AutoCompleteTextView и объявите прослушиватель щелчков для работы с позицией, которую вы там получили, если вы хотите установить несколько прослушивателей щелчков в строке по отдельности.

Например:

public class ExampleAdapter extends BaseAdapter {
    ...
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView.findViewById(R.id.ac_education);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Your code here
            }
        });
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...