Приводит ли вызов setOnClickListener из нескольких классов только к одному обратному вызову? - PullRequest
5 голосов
/ 27 марта 2012

Я бы хотел иметь возможность динамически менять OnItemClickListener на ListView. Однако API не ясно, является ли это приемлемым или нет, каков будет результат, если я это сделаю.

Что мне хотелось бы, так это то, что если я вызову listView.setOnItemClickListener() из одного класса, а затем снова из другого класса, то только последний класс получит обратный вызов.

Этот вопрос, кстати, также может относиться к SetOnClickListener().

API может быть реализован таким образом, но вместо этого он может быть реализован так, что все классы, которые вызвали setOnItemClickListener, получают обратный вызов.

Какое поведение фактически реализовано в API Android?

Ответы [ 3 ]

9 голосов
/ 27 марта 2012

Ознакомьтесь с исходным кодом AdapterView.setOnItemClickListener () здесь :

/**
 * Register a callback to be invoked when an item in this AdapterView has
 * been clicked.
 *
 * @param listener The callback that will be invoked.
 */
public void setOnItemClickListener(OnItemClickListener listener) {
    mOnItemClickListener = listener;
}

В мире Java обычно метод установки сбрасывает предыдущее значение и устанавливает переменную экземпляра объекта в значениеновое значение.Таким образом, поведение, о котором вы говорите: , только последний класс получает обратный вызов.


вместо этого он может быть реализован так, что все классыкоторый вызвал setOnItemClickListener получить обратный вызов.

В мире Java это также возможно, в этом случае, в качестве хорошей практики ООП, мы обычно называем его addOnItemClickListener (), а точнее, используемСписок слушателей хранит / управляет несколькими слушателями в рамках фактической реализации.Это не то, как AdapterView.setOnItemClickListener () реализован в API.

4 голосов
/ 27 марта 2012

Вы можете набрать setOnItemClickListener() столько раз, сколько захотите, будет использоваться только самый последний OnItemClickListener.

0 голосов
/ 27 марта 2012
String className = "MyOnClickListener";
obj = (OnClickListenerInterface)( Class.forName( className).newInstance() );

Вам придется создать интерфейс для слушателя, но вы можете реализовать разные слушатели в разных процессах, а затем вызывать каждый из них динамически, как показано в этой части кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...