#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). Где второй вызывающий отменяет первую задачу и не запускает новую задачу, если они занимают ту же позицию, что приводит к сбою первой задачи обновления.
Он хорошо работает с
- Галерея с базовым адаптером
- Фильтр внутри BaseAdapter (поиск элемента)
- OnHierachyChangeListener (добавление / удаление элемента по классу фильтра)
- 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();
}
МОЙ код просто останавливает предыдущую задачу и начинает новую, независимо от предыдущей и текущей позиции. На всякий случай вы также можете сделать это синхронизированным методом