Я использую Room DB для хранения пользовательских ценовых оповещений.
Список предупреждений отображается во фрагменте с кнопкой, которая запускает новое действие для добавления новой записи.
Когда я добавляю новую запись и возвращаюсь к фрагменту, RecyclerView не отображаетсяобновлен, хотя я возвращаю LiveData и добавил Обозреватель.Я попробовал несколько ответов здесь, например, Использование MutableLiveData вместо LiveData и несколько других, но он все еще не работает.
Я попробовал несколько ответов здесь, например, Использование MutableLiveData вместо LiveData и несколько других, но это все еще нене работает.
DOA
@Dao
public interface PriceAlertDoa {
public String tableName = DBContract.ALERTS_TABLE_NAME;
@Query("SELECT * FROM " + tableName)
public LiveData<List<PriceAlert>> getAll();
@Query("SELECT * FROM " + tableName + " WHERE " + DBContract.ALERTS_COL_COINID + " LIKE :coinId")
public List<PriceAlert> getByCoinId(String coinId);
@Query("SELECT COUNT(*) FROM " + DBContract.ALERTS_TABLE_NAME)
public int countUsers();
@Insert(onConflict = OnConflictStrategy.REPLACE)
public void insertAll(PriceAlert... priceAlerts);
@Delete
public void deleteAll(PriceAlert... priceAlert);
@Update
public void updateAll(PriceAlert... priceAlert);
}
Репозиторий
public class PriceAlertRepository {
private PriceAlertDatabase alertsDb;
private Context mContext;
public PriceAlertRepository(Context context){
mContext = context;
if(alertsDb == null){
alertsDb = Room.databaseBuilder(mContext.getApplicationContext(),
PriceAlertDatabase.class, DBContract.ALERTS_TABLE_NAME)
.build();
}
}
public void insertAlert(PriceAlert priceAlert) {
new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... voids) {
alertsDb.priceAlertDoa().insertAll(priceAlert);
return null;
}
}.execute();
}
public LiveData<List<PriceAlert>> getAllAlerts(){
return alertsDb.priceAlertDoa().getAll();
}
public void deleteAlert(PriceAlert priceAlert){
new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... voids) {
alertsDb.priceAlertDoa().deleteAll(priceAlert);
return null;
}
}.execute();
}
public void updateAlert(PriceAlert priceAlert){
new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... voids) {
alertsDb.priceAlertDoa().updateAll(priceAlert);
return null;
}
}.execute();
}
}
ViewModel
public class AlertsViewModel extends AndroidViewModel {
private PriceAlertRepository mAlertRepository;
private LiveData<List<PriceAlert>> mAlertList;
public AlertsViewModel(@NonNull Application application) {
super(application);
mAlertRepository = new PriceAlertRepository(application);
mAlertList = mAlertRepository.getAllAlerts();
}
public LiveData<List<PriceAlert>> getAllAlerts(){
return mAlertList;
}
}
Фрагмент, отображающий список оповещений
public class AlertsListFragment extends Fragment {
@BindView(R.id.recyclerView_Alerts)
RecyclerView rvAlerts;
@BindView(R.id.button_AddAlert)
Button btnAddAlert;
private Context mContext;
private AlertsViewModel alertsViewModel;
public AlertsListFragment(Context context) {
mContext = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_alerts_list, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
rvAlerts.setHasFixedSize(true);
rvAlerts.setLayoutManager(new LinearLayoutManager(mContext));
alertsViewModel = ViewModelProviders.of(this).get(AlertsViewModel.class);
btnAddAlert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.launchActivity(mContext, AddAlertActivity.class);
}
});
AlertsListAdapter adapter = new AlertsListAdapter(mContext);
rvAlerts.setAdapter(adapter);
alertsViewModel.getAllAlerts().observe(getViewLifecycleOwner(), new Observer<List<PriceAlert>>() {
@Override
public void onChanged(List<PriceAlert> priceAlerts) {
Log.d("LIVE DATA", "Table updated: " + priceAlerts.size());
adapter.updateData(priceAlerts);
}
});
}
}
Заранее спасибо.