Android Gallery просмотр слушателей добавить задержку? - PullRequest
3 голосов
/ 02 ноября 2011

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

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

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

Ответы [ 3 ]

3 голосов
/ 02 ноября 2011

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

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

Обновление:

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

    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);
    }
}

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

0 голосов
/ 14 января 2012

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

Хорошо работает с

  1. Галерея с BaseAdapter
  2. Фильтр внутри BaseAdapter (Поиск элемента)
  3. OnHierachyChangeListener (Добавить / Удалить элемент с помощью класса Filter)
  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();
}

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

0 голосов
/ 02 ноября 2011

Вместо реализации 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();
            }
        });
...