android: onClick реагирует только на второй щелчок в просмотре списка - PullRequest
5 голосов
/ 01 ноября 2011

Я нашел похожий вопрос о прокрутке списка и нажатии кнопки, но это не помогло мне. Моя проблема:

У меня есть список с пользовательскими строками. У меня есть два разных состояния просмотра списка; Переключатель между состояниями - это кнопка внизу экрана. Второе состояние имеет кнопки удаления в каждой строке. Когда я нажимаю кнопку «Удалить» в определенной строке, эта строка удаляется из базы данных, и список обновляется. Все отлично работает, за исключением того, что мне нужно дважды нажать кнопку удаления, чтобы она заработала. Ниже мой код для обработки кликов. флаг == 1 - это второе состояние просмотра списка.

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    View main = parent.getChildAt(position);
    TextView delete = (TextView)main.findViewById(R.id.delete_button);

    if(flag==0){
        switchToItemsView(id);
    }
    if(flag==1){
        delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mDbHelper.deleteList(id);
                        updateListView();
                    }});
    }
}

Я попытался установить для атрибута focusableInTouchMode родительского представления значение false, как предлагалось в другом посте, но это не помогло.

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

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 28 марта 2017

Возможно, у вас есть фокус. Удалить его.

android:focusableInTouchMode="true"
android:focusable="true"
2 голосов
/ 06 ноября 2011

Потратив часы, я понял, как это сделать:

Я переместил свой прослушиватель кликов из своего основного класса активности в свой пользовательский класс ListAdapter и изменил его, как показано ниже;

deleteButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int rowid = Integer.parseInt(rowIds.get(position));
        mDb.deleteList(rowid);
        lists.remove(position);
        notifyDataSetChanged();
    }
});

Теперь все отлично работает.Когда я нажимаю кнопку «Удалить», он удаляет список как из ArrayList (который используется в ListAdapter), так и из базы данных.

2 голосов
/ 01 ноября 2011

Вам необходимо объявить onClickListener перед проверкой фактического флага;в вашем случае вид меняется и с этим устанавливается флаг, и слушатель устанавливается.Следующий щелчок фактически вызывает слушателя.

Не связано, но вы должны изменить свой второй if на elseif, так как нет способа вызвать его, если будет вызван первый.

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