Android OnTouchListener изменить затронутый элемент

Я занимаюсь разработкой приложения для Android, в котором я использую GridView для рисования нескольких элементов. Для рисования предметов я написал адаптер - ImageAdapter, Каждое изображение представляет собой целое число, которое является ресурсом изображения, которое должно быть нарисовано в определенной позиции.

У меня есть изображения для моей собственной кнопки (одно изображение для "кнопки вверх" и одно для "кнопки вниз"). Я хочу обновить изображение "кнопка вверх" до "кнопка вниз", пока кнопка нажата. Поэтому я использую OnTouchListener,

Однако, когда я обновляю изображение в моем ImageAdapter и вызвать метод notifyDataSetChanged (который является методом класса BaseAdapter) слушатель не сообщает мне событие, когда кнопка больше не нажимается. Это потому, что ресурс, к которому OnTouchListener был установлен был изменен на новое изображение "кнопка вниз".

Однако, если я не позвоню notifyDataSetChanged(), все отлично, но тогда изображение кнопки обновляться не будет.

Мой код:

private void setTouchListenerForButtons(
  Project project, final ImageAdapter imgadapt, 
  IConnection currentConnection, boolean editmode
  ) {
    for(int i = 0; i < imgadapt.getCount(); i++) {
        View v = project.getGui().getGridView().getChildAt(i);

        try {
            Object tag = v.getTag();

            int p = 0;

            if (tag != null) { // Button
                p = (Integer) tag;

                final int btnPosition = p;
                project.getGui().getGridView().getChildAt(btnPosition).setOnTouchListener(new OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        Toast.makeText(getContext(), event.getAction() + "", Toast.LENGTH_SHORT).show();
                        switch (event.getAction()) {

                            case MotionEvent.ACTION_DOWN:
                                Log.d(LOG_TAG, "Button down");
                                imgadapt.update(R.drawable.button_on, btnPosition);
                                imgadapt.notifyDataSetChanged(); // that's the PROBLEM
                                break;

                            case MotionEvent.ACTION_UP:
                                Log.d(LOG_TAG, "Button up");
                                imgadapt.update(R.drawable.button_off, btnPosition);
                                imgadapt.notifyDataSetChanged();
                                break;
                        }

                        return true;
                    }
                });
            }
        } catch (NullPointerException e) {
        }

    }
}

Как я могу решить эту проблему?

1 ответ

Решение

Не использовать setOnTouchListener в этом случае. Создать селектор:

рисуем /selector_btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_default_pressed"
        android:state_pressed="true"/>
    <item android:drawable="@drawable/btn_default"/>
</selector>

и установите его как android:src конкретного изображения.

<ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/selector_btn_default"/>

Кстати, это совсем не хорошо, чтобы позвонить notifyDataSetChanged для этого вида использования. Неправильно обновлять весь GridView просто для того, чтобы изменить изображение на одном элементе.

Другие вопросы по тегам