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 просто для того, чтобы изменить изображение на одном элементе.