Присвоить onClickListener кнопкам, созданным в цикле

194
18 апреля 2017, 07:28

Необходимо присвоить кнопке, созданной программно в цикле, отдельный onClickListener. Я написал свой код, но он каждой кнопке присваивает Listener последней созданной. В чём моя ошибка?

Cursor pc;
while (pc.moveToNext()) {
    deleteNum = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                ContID = Long.decode(ID);
                String queryPhone = ContactsContract.Contacts.Data.RAW_CONTACT_ID + "='" + ContID + "'";
                String queryByNumber = ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + nomer + "'";
                removePhoneByNumber(ContID, nomer, queryPhone ,queryByNumber);
                }
            catch (Exception e) {
                e.printStackTrace();
                }
            Toast.makeText(getApplicationContext(), "Запущен процесс удаления", Toast.LENGTH_SHORT).show();
        }
    };
    ImageView phoneD = new ImageView(this);
    phoneD.setImageResource(R.drawable.delete_4590);
    phoneD.setLayoutParams(butParams);
    phoneD.setOnClickListener(deleteNum);
    phoneD.setTag("Delete" + i);
    layout.addView(phoneD);
}
Answer 1

Ваша ошибка в том, что вы присваиваете кнопкам ссылку на слушатель нажатий. А этой ссылке вы в каждой итерации присваиваете новый объект-слушатель. Таким образом у вас n раз создаётся новый объект-слушатель, но он присваивается в одну и ту же переменную которую вы и назначаете кнопке.

Вам надо для каждой кнопки создать отдельную переменную-слушатель и её кнопкам назначать.

Cursor pc;
while (pc.moveToNext()) {
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                ContID = Long.decode(ID);
                String queryPhone = ContactsContract.Contacts.Data.RAW_CONTACT_ID + "='" + ContID + "'";
                String queryByNumber = ContactsContract.CommonDataKinds.Phone.NUMBER + "='" + nomer + "'";
                removePhoneByNumber(ContID, nomer, queryPhone ,queryByNumber);
                }
            catch (Exception e) {
                e.printStackTrace();
                }
            Toast.makeText(getApplicationContext(), "Запущен процесс удаления", Toast.LENGTH_SHORT).show();
        }
    };
    ImageView phoneD = new ImageView(this);
    phoneD.setImageResource(R.drawable.delete_4590);
    phoneD.setLayoutParams(butParams);
    phoneD.setOnClickListener(listener);
    phoneD.setTag("Delete" + i);
    layout.addView(phoneD);
}
READ ALSO
Передать в action данные из адресной строки

Передать в action данные из адресной строки

Допустим, мы находимся на странице (неважно какой) и у нас в адресной строке что-то вроде: https://sitecom/app/backend

188
Блоки в ряд, адаптация по ширене экрана

Блоки в ряд, адаптация по ширене экрана

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

251
Непонятные отступы у текста сверху и снизу (не margin)

Непонятные отступы у текста сверху и снизу (не margin)

Доброй ночи, уважаемые коллеги!

341