Fotonick
@Fotonick
android-er (Навальный отменит налоги фрилансерам)

Как исправить обработку кнопок?

по здешней подсказке реализовал обработку трёх кнопок внутри элемента списка с помощью Callback

в адаптер добавил
private Callbacks callbacks;

    public interface Callbacks {
        void onAppAccept(int position);

        void onAppEdit(int position);

        void onAppDelete(int position);
    }

    public void setCallbacks(Callbacks callbacks) {
        this.callbacks = callbacks;
    }


там же в адаптере обработчик кнопки вызывает один из методов
holder.appEdit = (Button) convertView.findViewById(R.id.appEdit);
            holder.appEdit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    callbacks.onAppEdit(position);

                }
            });


Во фрагменте перед назначением адаптера

oneAppAdminAdapter = new OneAppAdminAdapter(AllAppsAdminFragment.this, allAppsList);

                        oneAppAdminAdapter.setCallbacks(new OneAppAdminAdapter.Callbacks() {
                            @Override
                            public void onAppAccept(int position) {

                               //вызов асинтаска принятия
                            }

                            @Override
                            public void onAppEdit(int position) {                                

                               //вызов фрагмента редактирования
                            }

                            @Override
                            public void onAppDelete(int position) {
                               //вызов асинтаска удаления
                            }
                        });

                        setListAdapter(oneAppAdminAdapter);


извлекаю данные из списка во фрагменте так
OneAppClass op = (OneAppClass) allAppsList.get(position);


Но решение оказалось с подвохом. Во-первых у 8-го элемента списка параметр position может оказаться равным например 1. Во-вторых при разной скорости пролистывания значение position у одного и того же элемента может быть разным. Например если пролистывать медленно, то последний элемент списка получает position=1, а если пролистать быстро, то position=2. Я так понимаю это зависит от того какой уже существующий элемент списка будет повторно использоваться для новопоказавшегося. В конечном итоге при обработке нажатия на кнопку из arraylist извлекаются данные не того элемента который нужен. Подскажите как исправить это решение, или как совсем переписать обработку кнопок, чтобы извлекались верные данные. Проблема не была заметна, пока все элементы списка влезали на экран без прокрутки.
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
Fotonick
@Fotonick Автор вопроса
android-er (Навальный отменит налоги фрилансерам)
Всё оказалось элементарно. Надо было просто в каждом обработчике кнопки перед вызовом callback извлечь нужный элемент из arraylist. И передавать в колбеке не position а сам oneAppClass

oneAppClass = (OneAppClass) getItem(position);
callbacks.onAppEdit(oneAppClass);

Соответственно
public interface Callbacks {
void onAppAccept(OneAppClass oneAppClass);

void onAppEdit(OneAppClass oneAppClass);

void onAppDelete(OneAppClass oneAppClass);
}

А иначе им оставался последний загруженный элемент списка, что логично не соответствовало нажатой кнопке.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы