Поиск кнопки, добавленной в TableRow по идентификатору в OnLongClick в Android?

У меня есть TableLayout с динамически добавляемыми TableRows в зависимости от размера курсора. В каждую строку я добавляю кнопку Удалить, для которой установлено значение Невидимый. Каждая строка и кнопка при создании получают одинаковый идентификатор, если они принадлежат одной и той же строке. КОГДА пользователь выполняет LongClicks в TableRow, вместо этого видимость устанавливается на Visible и появляется кнопка Удалить.

В прослушивателе OnLongClick я проверяю, совпадает ли идентификатор кнопки с представлением (здесь TableRow), на которое был нажат.

        rel.addView(btnDelete);
            tr.addView(rel);


        tr.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    int tableRowId = view.getId();
                 if(tableRowId == btnDelete.getId()){
                    btnDelete.setVisibility(View.INVISIBLE);
                    }
                    return true;
                }
            });

Но это кажется верным только для кнопки на нижней нижней кнопке. Таким образом, кажется, что btnId сохраняется как последнее добавленное btnId, поскольку единственное TableRow, для которого оно истинно, является последним. Но когда я использую .setText(btnId + tableRowId), я вижу, что у них один и тот же идентификатор.

Я тоже пытался использовать Tag, но столкнулся с той же проблемой.

Большое спасибо!

Редактировать:

btnDelete = new Button(this);
btnDelete.setId(revolutionCounter);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,
                        RelativeLayout.TRUE);
params.addRule(RelativeLayout.CENTER_VERTICAL);

btnDelete.setLayoutParams(params);
rel.addView(btnDelete);//a relativelayout inside the tablerow
tr.addView(rel);

Затем я добавляю tr (tablerow) в tablelayout. Так я предполагаю, что я повторно использую кнопки? Как мне поступить, создав новые? Я думал, что это то, что я делал с new Button(this);


person kakka47    schedule 05.06.2011    source источник
comment
Вы создаете новый btnDelete для каждой строки? Не используйте их повторно. Опубликуйте больше кода, и вам будет легче помочь.   -  person Maragues    schedule 05.06.2011


Ответы (1)


Несколько решений

  • Вместо того, чтобы захватывать длинный щелчок в строке таблицы, захватите его непосредственно на кнопке удаления, выполнив

btndelete.setDuplicateParentStateEnabled(true)

Button.setDuplicateParentStateEnabled(boolean)

Добавьте LongClickListener в btnDelete и установите видимость на Visible/invisible, переключите его или сделайте все, что хотите. Если вам нужно получить доступ к строке таблицы внутри longclickListener, вызовите

TableRow tableRow = (TableRow) view.getParent();

  • Если вы хотите сохранить longclicklistener в TableRow, вы можете получить доступ к его дочернему элементу btnDelete следующим образом:

    Button btnDelete = view.findViewById(view.getId());

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

btnDelete = new Button(this);

вам нужно переобъявить его

Button btnDelete = new Button(this);

Может быть, это не важно, и, вероятно, каждая строка хранит значение объекта кнопки (иначе он бы даже не отображался), но в других ситуациях это доставляло мне некоторые головные боли. В этом случае, возможно, можно повторно использовать объявление переменной.

person Maragues    schedule 06.06.2011
comment
Потрясающий! Работал как шарм, сначала объявляя каждую кнопку с помощью Button, а затем findViewById(view.getId()); Большое спасибо! - person kakka47; 06.06.2011