Прослушиватели просмотра галереи Android добавляют задержку?

#android #android-gallery

#Android #android-галерея

Вопрос:

Я реализовал галерею и просмотр списка. В галерее есть изображения, и когда я нажимаю на изображение с помощью setOnItemSelectedListener, обновляется Listview, в котором содержится информация о выбранном изображении.

Проблема: когда я быстро просматриваю галерею, она быстро обновляет мой listview. Но, по моему мнению, listview должен дождаться, пока галерея перестанет перемещаться по любому изображению, а затем обновить его содержимое.

Кто-нибудь знает, как это сделать или добавить время между обновлением listview? Пожалуйста, помогите..

Ответ №1:

Вместо этого вы можете попробовать setOnItemClickListener. Он будет запущен только тогда, когда вы на самом деле «нажмете» на изображение, а не просто выберете его.

     gallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            // Do what you want
        }
    });
  

Обновить:

Если вы хотите выполнить действие с задержкой вместо реализации OnItemClickListener, у вас есть (как минимум) два варианта. Один из них — запустить отдельный поток с таймаутом (Thread.sleep()), и после того, как это будет сделано, вы можете использовать обработчик для обновления состояния вашей активности. Другой вариант — использовать AsyncTask, то есть технически тот же подход, он только переносит выполняемую задачу и обработчик в один внутренний класс. Самая простая реализация может быть такой:

     ListUpdater listUpdater; 

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {

    // We have to run this thread to add delay before updating activity views
    if (listUpdater != null) { // Cancel previous task
        listUpdater.cancel(true);
    }
    if (listUpdater == null || position != listUpdater.getPosition()) {
        listUpdater = null;
        listUpdater = new ListUpdater(position);

        listUpdater.execute();
    }
}

class ListUpdater extends AsyncTask<String, String, String> {
    private int position;

    public int getPosition() {
        return position;
    }

    public ListUpdater(int position) {
        this.position = position;
    }

    @Override
    protected String doInBackground(String... params) { 
        try {
            Thread.sleep(600); // set delay time here
        } catch (InterruptedException e) {
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if (!isCancelled()) {
            // If another thread is not running, 
            //  that is if another item was not selected,
            //  update the activity 

            // Add code here to update the activity 
            // This method works in UI Thread, so you don't need to use Handler
            // For example:
            Toast.makeText(YourActivity.this, ""   position, Toast.LENGTH_SHORT).show();
        }
        super.onPostExecute(result);
    }
}
  

Это пример реализации задержки. Не обязательно точно соответствовать вашим потребностям, но у вас могут быть некоторые идеи, как это сделать.

Комментарии:

1. мое приложение нуждается в том, чтобы при выборе изображения (не щелчка) оно автоматически обновляло listview (например, выбор обоев в Android). Также теперь это похоже на выбор обоев. НО я просто хочу, чтобы он подождал 1 секунду перед обновлением listview. (как будто он ждет при выборе обоев в Android)

2. Я попробую и дам вам знать.. Спасибо 🙂

3. просто отредактируйте конструктор класса ListUpdater «CourseInformationUpdater» на «ListUpdater»

Ответ №2:

Вместо реализации setOnItemSelectedListener реализуйте OnItemClickListener:

   Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setAdapter(new ImageAdapter(this));

        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Toast.makeText(HelloGallery.this, ""   position, Toast.LENGTH_SHORT).show();
            }
        });
  

Комментарии:

1. OnItemClickListener не соответствует потребностям моего приложения.. при прокрутке изображений галереи он должен автоматически обновлять listview. не щелкая изображение. Но это должно подождать (может быть 1 сек), а затем обновить listview не мгновенно.

Ответ №3:

Однако после обращения к решению morphium с использованием AsyncTask я обнаружил проблему с несколькими вызывающими абонентами (например, OnHierachyChangeListener и OnItemSelectedListener). Где второй вызывающий отменяет первую задачу и не запускает новую задачу, если они занимают ту же позицию, что приводит к сбою первой задачи обновления.

Он хорошо работает с

  1. Галерея с базовым адаптером
  2. Фильтр внутри BaseAdapter (поиск элемента)
  3. OnHierachyChangeListener (добавление / удаление элемента по классу фильтра)
  4. OnItemSelectedListener (действие пользователя)

И это моя версия кода

 @Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {

    // We have to run this thread to add delay before updating activity views
    if (listUpdater != null) { // Cancel previous task
        listUpdater.cancel(true);
    } 
    listUpdater = new ListUpdater(position);
    listUpdater.execute();
}
  

МОЙ код просто останавливает предыдущую задачу и начинает новую, независимо от предыдущей и текущей позиции. На всякий случай вы также можете сделать это синхронизированным методом