1

Я ищу лучший образец реализации в Android для обновления списка, когда один из элементов изменяется в другом действии.Как обновить элемент в списке адаптеров после внесения изменений в элемент в другой Деятельности?

Представьте себе, что этот пользователь путешествие:

Процесс асинхронной получает десять (10) контакта профилей с веб-сервера. Они помещаются в массив, и адаптер уведомляется. Десять (10) профилей контактов теперь отображаются в списке.

Пользователь нажимает на профиль контакта пять (5). Он открывает информацию о деталях этого профиля контакта. Пользователь решает, что им это нравится, и нажимает «добавить в избранное». Это вызывает асинхронный запрос на веб-сервер, который пользователь получил профили контакта 5 (5).

Пользователь нажимает на кнопку. Теперь они снова представлены в списке. Проблема в том, что список устарел сейчас и не показывает, что профиль пять (5) используется.

ли вам:

  • Асинхронный вызова веб-сервер для обновленных данных и уведомления адаптера, чтобы обновить весь список. Это кажется неэффективным, так как вызов списка может занять пару секунд.

  • Приобретая профиль, храните объект где-нибудь (возможно, в службе singleton), помеченный как 'refresh'. OnResume в активности List вы нюхаете переменную и обновляете только этот элемент в списке.

  • Убедитесь, что массив списка является статическим. Обновите массив из активности детали. OnResume в активности всегда уведомляет адаптер об обновлении.

  • Убедитесь, что массив и адаптер списка являются статическими. Обновите массив и уведомите адаптер об активности детали.

Любые другие варианты? Каков наилучший принцип дизайна для этого?

ответ

0

Async вызывается веб-сервером для получения обновленных данных и уведомляет адаптер , чтобы обновить весь список. Это кажется неэффективным, поскольку вызов для списка может занять пару секунд.

Как вы говорите, это очень неэффективно. Создание объекта дорого стоит в Android.Создание списка многих объектов намного дороже.

Приобретая профиль, храните объект где-нибудь (возможно, в службе singleton), помеченной как 'refresh'. OnResume в активности списка вы нюхаете переменную и обновляете только этот элемент в списке.

Это нехорошее решение, потому что существует вероятность того, что приложение завершится с ошибкой, прежде чем мы обновим объект или приложение будет убито устройством.

Убедитесь, что массив списка является статическим. Обновите массив из операции . OnResume в активности всегда уведомляет адаптер для обновления.

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

Убедитесь, что массив и адаптер списка являются статическими. Обновите массив и уведомите адаптер об активности детали.

То же, что и выше, статическая переменная или объект - это не выход.

Лучше использовать систему автобусов, например EventBus.

Всякий раз, когда вы нажимаете на кнопку 'add to favourite', отправьте запрос async для обновления избранного веб-сервера, а также отправьте событие в список для обновления определенного объекта профиля. Например, если ваша компания имеет идентификатор «777» и профиль Добавлен в избранное подробно деятельности, то вам нужно отправить что-то событие, как это в:

btnFavourite.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) {    
    // Send event when click favourite. 
    EventBus.getDefault.post(new RefreshProfileEvent(id, true); 
    } 
}); 

RefreshProfileEvent простой POJO:

public class RefreshProfileEvent { 
    private String id; 
    private boolean isFavourited; 

    public RefreshProfileEvent(String id, boolean isFavourited) { 
    this.id = id; 
    this.isFavourited = isFavourited; 
    } 
    //getter and setter 
} 

Тогда вы можете получить событие в списке вашей деятельности, чтобы обновить выбранный профиль:

public class YourListActivity { 
    ... 
    @Override 
    protected onCreate() { 
    ... 
    EventBus.getDefault().register(this); 
    } 

    @Override 
    protected onDestroy() { 
    super.onDestroy(); 
    EventBus.getDefault().unregister(this); 
    } 

    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onMessageEvent(RefreshProfileEvent event) { 
    // Refresh specific profile 
    // For example, your profile is saved in List<Profile> mProfiles 

    // Search for profile by its id. 
    for(int i = 0; i < mProfiles.size(); i++) { 
     if(mProfiles.getId().equals(event.getId()) { 
     // Refresh the profile in the adapter. 
     // I assume the adapter is RecyclerView adapter named mAdapter 
     mProfiles.get(i).isFavourited(true); 
     mAdapter.notifyItemChanged(i); 
     // Stop searching. 
     break; 
    } 
    } 
} 

Вам не нужно ждать As Результат запроса yncTask, возвращаемый сервером. Просто сделайте профиль первым и не ожидая результата. Если ваш запрос успеха, не делайте ничего. Но если ошибка запроса, сделайте профиль невозбужденным и отправьте сообщение об ошибке, например SnackBar, чтобы сообщить пользователю.

+0

Это действительно замечательный подробный ответ. Спасибо. Я еще не слышал или не использовал EventBus, но я, конечно, начну использовать его с этого момента. – user2694255

+0

добро пожаловать. Существует также RxJava, но я не использовал его раньше. –

0

Третий вариант является лучшим, когда пользователь изменяет данные в деталях активности, которые необходимо изменить, а затем, когда использование возвращается к вызову основной активности Adapter.notifyDataSetChanged(); сделают трюк

0

Для ArrayAdapter, notifyDataSetChanged работает только если вы используете функции add(), insert(), remove() и clear() в адаптере.

Вы можете сделать что-то вроде этого:

@Override 
protected void onResume() { 
    super.onResume(); 
    Refresh(); 
} 

public void Refresh(){ 
    items = //response.... 
    CustomAdapter adapter = new CustomAdapter(MainActivity.this,items); 
      list.setAdapter(adapter); 

     } 

На каждой onResume деятельности будет обновить список. Надеюсь, это поможет вам.