Android GalleryView setCallbackDuringFling вызывает заикание

#android

#Android

Вопрос:

Я пытался использовать setCallbackDuringFling для обновления некоторого индикатора во время просмотра галереи, и каким-то образом, всякий раз, когда я устанавливаю для него значение (true), он заикается. Когда я говорю «заикание», я имею в виду, что следующее изображение прыгает / щелкает в поле зрения, таким образом, изображение очень нервное во время броска. Даже когда я перетаскиваю его очень медленно, появляется следующее изображение, затем, когда оно на полпути, оно встает на место.

Однако, если я установлю для него значение false (таким образом, onItemSelected все равно вызывается, но только один раз, когда бросок останавливается), прокрутка / бросок происходит очень плавно.

Мой onItemSelected (см. Код ниже) совсем не интенсивный, поэтому я подозреваю, что заикание вызвано чем-то за кулисами.

Есть идеи по решению этой проблемы?

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

 // Set up Gallery listeners
myGallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

    // When scrolling stops, set the indicators
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        ImageView myIV;

        // First reset myCurrentDot
        myIV = (ImageView) findViewById (myDotID[myCurrentDot]);
        myIV.setImageResource(R.drawable.grey);
        // The set the "position" dot to red
        myIV = (ImageView) findViewById (myDotID[position]);
        myIV.setImageResource(R.drawable.red);
        // update myCurrentDot
        myCurrentRedDot = position;
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }
}); // End Gallery Listener
  

Ответ №1:

При setCallbackDuringFling() вызове с true , каждый раз, когда выбирается элемент, он onItemSelected вызывается в вашем AdapterView.OnItemSelectedListener экземпляре.

Глядя на ваш код, мы можем видеть, что findViewById() вызывается дважды. Возможно, поиск представления — слишком сложный процесс. Возможно, вместо того, чтобы каждый раз выполнять поиск в представлениях, вы можете использовать механизм кэширования представлений. Просто замените кэш идентификаторов макета ( myDotID ) на кэш просмотра ( ImageView[] myDotViews ).