Gridview: теряет OnItemClickHandler - PullRequest
       0

Gridview: теряет OnItemClickHandler

0 голосов
/ 02 февраля 2012

Я сейчас застрял с очень странной ошибкой. У меня есть gridview, который заполнен некоторыми пользовательскими представлениями. Обработчик щелчков работает в соответствии с требованиями, пока я не прокручиваю.

Но когда я прокручиваю вниз, обработчик событий теряется и больше не реагирует. Я уже пытался добавить onScrollEventHandler, но, похоже, он тоже теряется.

Код довольно стандартный:

    grdVwUser = (GridView)findViewById(R.id.grdVwUser);
    grdVwUser.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
                long arg3) {
            Log.e(TAG, "GOT CLICKED");

            final Intent intent = getMyIntent(); // intent for another activity
            startActivity(intent);
        }
    });

Есть идеи, что бы это могло быть?

Дополнительно: я также получил это сообщение об ошибке в logcat

02-02 14:02:23.636: W/KeyCharacterMap(13871): Bad keycharmap - filesize=32
02-02 14:02:23.636: W/KeyCharacterMap(13871): Error loading keycharmap file '/system/usr/keychars/bravo-keypad.kcm.bin'. hw.keyboards.0.devname='bravo-keypad'
02-02 14:02:23.636: W/KeyCharacterMap(13871): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

Но более того, GC, похоже, проделывает большую работу:

   02-02 15:51:11.956: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 11572 objects / 678832 bytes in 62ms
   02-02 15:51:12.096: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 1581 objects / 65072 bytes in 55ms
   02-02 15:51:12.256: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 301 objects / 23248 bytes in 55ms
   02-02 15:51:12.406: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 194 objects / 7816 bytes in 52ms
   02-02 15:51:12.556: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 104 objects / 3920 bytes in 52ms
   02-02 15:51:12.686: D/dalvikvm(16606): GC_EXTERNAL_ALLOC freed 107 objects / 3968 bytes in 54ms

Может ли быть так, что ГХ уничтожает объект, который связывает обработчик с видом сетки? (Такое же поведение возникает, когда я использую само действие как OnItemClickhandler)

Результат отладки 1: Я также попробовал это, не начиная другую деятельность. В моих ячейках сетки отображаются изображения, загруженные с веб-сервера. Когда я прокручивал, он потерял обработчик событий, но когда асинхронная задача установила новое изображение, я вернул его и смог щелкнуть снова. Но после прокрутки я снова потерял.

Результат отладки 2: После игры я добавил обработчик onscroll-обработчик, который устанавливает новый анонимный класс в качестве обработчика событий, который вызывает метод onItemClicked действия. Просто чтобы увидеть, сработает ли это - это не так! Я также добавил вывод журнала в анонимном методе и в прокрутке. Вызывается прокрутка on, но не обрабатывается обработчик события onItemClicked. Что бы это могло значить?

Результат отладки 3: OnTouch срабатывает, даже если onItemClicked этого не делает.

1 Ответ

0 голосов
/ 02 февраля 2012

Я закончил тем, что написал сам пожарный механик по событиям:

    grdVwUser.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int newy = (int)(event.getY());
            boolean val = false;
            int traveled = 0;

            if(event.getAction() == MotionEvent.ACTION_MOVE) {
                traveled = Math.max(newy - lastTouchedY, lastTouchedY - newy);
            }
            // lastTouchedY is a member var
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                lastTouchedY = (int)event.getY();
            } else if(event.getAction() == MotionEvent.ACTION_UP) {
                if(traveled <= 40) {
                    int pos = grdVwUser.pointToPosition((int)event.getX(), (int)event.getY());      
                    Main.this.onItemClick(null, grdVwUser, pos, -1);
                    val = true;
                }
            }

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