Java 房间数据库:在删除详细信息活动中的数据后,RecyclerView不会更新

Java 房间数据库:在删除详细信息活动中的数据后,RecyclerView不会更新,java,android,android-recyclerview,android-room,android-mvvm,Java,Android,Android Recyclerview,Android Room,Android Mvvm,我正在使用RecyclerView来显示最喜爱的电影列表,当用户单击我的RecyclerView列表中的项目时,它将打开DetailActivity,在此活动中,用户可以从最喜爱的列表中删除数据。当用户在DetailActivity中单击backpressed时,myRecyclerView中没有发生任何事情,它仍然显示已删除的数据 这是我的电影片段: public class MovieFragment extends BaseFragment<FragmentMovieBind

我正在使用
RecyclerView
来显示最喜爱的电影列表,当用户
单击我的
RecyclerView
列表中的项目时,它将打开
DetailActivity
,在此
活动中,用户可以从最喜爱的列表中删除数据。当用户在
DetailActivity
中单击backpressed
时,my
RecyclerView
中没有发生任何事情,它仍然显示已删除的数据

这是我的电影片段:

    public class MovieFragment extends BaseFragment<FragmentMovieBinding, MovieViewModel>
        implements MovieNavigator, MovieAdapter.MovieAdapterListener {

    @Inject
    MovieAdapter adapter;

    @Inject
    LinearLayoutManager mLayoutManager;

    @Inject
    ViewModelProviderFactory factory;

    FragmentMovieBinding fragmentMovieBinding;

    private MovieViewModel movieViewModel;

    private static final String ARG_PARAM = "flag_data";

    private int mData;

    public static MovieFragment newInstance(int data) {
        Bundle args = new Bundle();
        MovieFragment fragment = new MovieFragment();
        args.putInt(ARG_PARAM, data);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getBindingVariable() {
        return BR.viewModel;
    }

    @Override
    public int getLayoutId() {
        return R.layout.fragment_movie;
    }

    @Override
    public MovieViewModel getViewModel() {
        movieViewModel = ViewModelProviders.of(this, factory).get(MovieViewModel.class);
        return movieViewModel;
    }

    @Override
    public void handleError(String error) {
        // handle error
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mData = getArguments().getInt(ARG_PARAM);
        }

        movieViewModel.setNavigator(this);
        adapter.setListener(this);
        movieViewModel.fetchData(mData);
        subscribeToLiveData();
    }

    @Override
    public void onRetryClick() {
        movieViewModel.fetchData(mData);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        fragmentMovieBinding = getViewDataBinding();
        setUp();
    }


    private void subscribeToLiveData() {
        movieViewModel.getMovieListLiveData().observe(this, movieList -> {
            movieViewModel.setMovieDataList(movieList);
            adapter.setData(movieList);
        });
    }

    @Override
    public void updateData(List<Movie> movieList) {
        adapter.addItems(movieList);
    }

    private void setUp() {
        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        fragmentMovieBinding.recyclerMovie.setLayoutManager(mLayoutManager);
        fragmentMovieBinding.recyclerMovie.setItemAnimator(new DefaultItemAnimator());
        fragmentMovieBinding.recyclerMovie.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}
有关详细信息,这是我的
DetailActivity

    public class DetailActivity extends BaseActivity<ActivityDetailBinding, DetailViewModel> implements DetailNavigator {
    @Inject
    ViewModelProviderFactory factory;

    private DetailViewModel detailViewModel;

    public static final String INTENT_ID = "id_intent";

    public static final String INTENT_FLAG = "id_flag";

    private ActivityDetailBinding mActivityDetailBinding;

    public static Intent newIntent(Context context) {
        return new Intent(context, DetailActivity.class);
    }

    @Override
    public int getBindingVariable() {
        return BR.viewModel;
    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_detail;
    }

    @Override
    public DetailViewModel getViewModel() {
        detailViewModel = ViewModelProviders.of(this, factory).get(DetailViewModel.class);
        return detailViewModel;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityDetailBinding = getViewDataBinding();
        detailViewModel.setNavigator(this);
        initData(savedInstanceState);
        initView();

    }


    private void initData(Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                int id = extras.getInt(INTENT_ID, 0);
                int flag = extras.getInt(INTENT_FLAG, 0);
                if (isNetworkConnected()) {
                    detailViewModel.fetchDetail(id, flag);
                    detailViewModel.setIsConnected(true);
                } else {
                    detailViewModel.setIsConnected(false);
                    CommonUtils.ShowSnackBars(mActivityDetailBinding.getRoot(), getString(R.string.msg_error_connection), 0, this);
                }
            }
        }
    }

    private void initView() {
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }


    @Override
    public void ShowProgressDialog(Boolean loading) {
        if (loading) {
            showLoading();
        } else {
            hideLoading();
        }
    }

    @Override
    public void onBackArrowClick() {
        onBackPressed();
    }

    @Override
    public void onFavProcess(int flag) {
        if (flag == 0) {
            CommonUtils.ShowSnackBars(mActivityDetailBinding.getRoot(), getString(R.string.msg_success_add_fav), 1, this);
        }else {
            CommonUtils.ShowSnackBars(mActivityDetailBinding.getRoot(), getString(R.string.msg_success_remove_fav), 1, this);
        }
    }


    @Override
    public String noDesc() {
        return getResources().getString(R.string.no_desc);
    }
}
让我困惑的是,我已经使用以下代码订阅了
MovieFragment
中的
LiveData

private void subscribeToLiveData () {
         movieViewModel.getMovieListLiveData (). observe (this, movieList -> {
             movieViewModel.setMovieDataList (movieList);
             adapter.setData (movieList);
         });
     } 
但是当我在
DetailActivity
中执行
onBackPressed
时,
RecyclerView
中没有变化。但是如果我先转到另一个菜单,如
Catalog
,然后再返回到
Favorite
,数据就会改变,然后
RecyclerView
就会改变


我希望有人能帮我解决这个问题。谢谢

您没有在适配器中的
cleartItems()
方法中提到
notifyDataSetChanged()

    public class DetailActivity extends BaseActivity<ActivityDetailBinding, DetailViewModel> implements DetailNavigator {
    @Inject
    ViewModelProviderFactory factory;

    private DetailViewModel detailViewModel;

    public static final String INTENT_ID = "id_intent";

    public static final String INTENT_FLAG = "id_flag";

    private ActivityDetailBinding mActivityDetailBinding;

    public static Intent newIntent(Context context) {
        return new Intent(context, DetailActivity.class);
    }

    @Override
    public int getBindingVariable() {
        return BR.viewModel;
    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_detail;
    }

    @Override
    public DetailViewModel getViewModel() {
        detailViewModel = ViewModelProviders.of(this, factory).get(DetailViewModel.class);
        return detailViewModel;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityDetailBinding = getViewDataBinding();
        detailViewModel.setNavigator(this);
        initData(savedInstanceState);
        initView();

    }


    private void initData(Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                int id = extras.getInt(INTENT_ID, 0);
                int flag = extras.getInt(INTENT_FLAG, 0);
                if (isNetworkConnected()) {
                    detailViewModel.fetchDetail(id, flag);
                    detailViewModel.setIsConnected(true);
                } else {
                    detailViewModel.setIsConnected(false);
                    CommonUtils.ShowSnackBars(mActivityDetailBinding.getRoot(), getString(R.string.msg_error_connection), 0, this);
                }
            }
        }
    }

    private void initView() {
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }


    @Override
    public void ShowProgressDialog(Boolean loading) {
        if (loading) {
            showLoading();
        } else {
            hideLoading();
        }
    }

    @Override
    public void onBackArrowClick() {
        onBackPressed();
    }

    @Override
    public void onFavProcess(int flag) {
        if (flag == 0) {
            CommonUtils.ShowSnackBars(mActivityDetailBinding.getRoot(), getString(R.string.msg_success_add_fav), 1, this);
        }else {
            CommonUtils.ShowSnackBars(mActivityDetailBinding.getRoot(), getString(R.string.msg_success_remove_fav), 1, this);
        }
    }


    @Override
    public String noDesc() {
        return getResources().getString(R.string.no_desc);
    }
}
     public class DetailViewModel extends BaseViewModel<DetailNavigator> {

        private final ObservableField<String> originalName = new ObservableField<>();
        private final ObservableField<String> releaseDate = new ObservableField<>();
        private final ObservableField<String> overview = new ObservableField<>();
        private final ObservableField<String> genreMovie = new ObservableField<>();
        private final ObservableField<String> posterPath = new ObservableField<>();
        private final ObservableField<String> voteAverage = new ObservableField<>();
        private MutableLiveData<Integer> idDetail = new MutableLiveData<>();
        private MutableLiveData<Boolean> flagDetail = new MutableLiveData<>();
        private MutableLiveData<Integer> flagScreen = new MutableLiveData<>();

        private Movie movie;

        private TvShow tvShow;


        public DetailViewModel(DataManager dataManager, SchedulerProvider schedulerProvider) {
            super(dataManager, schedulerProvider);
        }

        public void fetchDetail(int id, int flag) {
            if (flag == 1) {
                getNavigator().ShowProgressDialog(true);
                getCompositeDisposable().add(getDataManager()
                        .getApiHelper().doDetailMovie(id, URLConfig.API_KEY, getDataManager().getLanguage())
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribe(detailResponse -> {
                            flagScreen.setValue(flag);
                            setUpData(detailResponse);
                            getNavigator().ShowProgressDialog(false);
                        }, throwable -> {
                            getNavigator().ShowProgressDialog(false);
                        }));
            } else if (flag == 2) {
                getNavigator().ShowProgressDialog(true);
                getCompositeDisposable().add(getDataManager()
                        .getApiHelper().doDetailTV(id, URLConfig.API_KEY, getDataManager().getLanguage())
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribe(detailResponse -> {
                            flagScreen.setValue(flag);
                            setUpData(detailResponse);
                            getNavigator().ShowProgressDialog(false);
                        }, throwable -> {
                            getNavigator().ShowProgressDialog(false);
                        }));
            }
        }

        private void setUpData(DetailResponse detailResponse) {
            if (flagScreen.getValue() == 1) {
                movie = new Movie();
                movie.setId(detailResponse.getId());
                movie.setTitle(detailResponse.getOriginal_title());
                movie.setPoster_path(detailResponse.getPoster_path());
                movie.setRelease_date(detailResponse.getRelease_date());
                movie.setVote_average(detailResponse.getVote_average());
            } else {
                tvShow = new TvShow();
                tvShow.setId(detailResponse.getId());
                tvShow.setTitle(detailResponse.getOriginal_name());
                tvShow.setPoster_path(detailResponse.getPoster_path());
                tvShow.setFirst_air_date(detailResponse.getFirst_air_date());
                tvShow.setVote_average(detailResponse.getVote_average());
            }

            if (detailResponse.getOriginal_name() != null) {
                originalName.set(detailResponse.getOriginal_name());
            } else if (detailResponse.getOriginal_title() != null) {
                originalName.set(detailResponse.getOriginal_title());
            } else {

            }

            if (detailResponse.getFirst_air_date() != null) {
                releaseDate.set(detailResponse.getFirst_air_date());
            } else {
                releaseDate.set(detailResponse.getRelease_date());
            }

            if (!detailResponse.getOverview().equals("")) {
                overview.set(detailResponse.getOverview());
            } else {
                overview.set(getNavigator().noDesc());
            }

            posterPath.set(String.valueOf(detailResponse.getPoster_path()));

            voteAverage.set(String.valueOf(detailResponse.getVote_average()));

            String genres = "";

            for (int i = 0; i < detailResponse.getGenreList().size(); i++) {
                genres = genres + detailResponse.getGenreList().get(i).getName();
                if (i != detailResponse.getGenreList().size() - 1) {
                    genres = genres + ", ";
                }
            }

            genreMovie.set(genres);

            idDetail.setValue(detailResponse.getId());

            setUpFlagFav();
        }

        private void setUpFlagFav() {
            if (flagScreen.getValue() == 1) {
                getCompositeDisposable().add(getDataManager()
                        .getDbHelper().getMovie(idDetail.getValue())
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribe(response -> {
                            if (response.size() > 0) {
                                flagDetail.setValue(true);
                            } else {
                                flagDetail.setValue(false);
                            }
                            Log.i("CEK INSERT", String.valueOf(flagDetail.getValue()));
                        }, throwable -> {
                            flagDetail.setValue(false);
                        }));
            }else if (flagScreen.getValue() == 2) {
                getCompositeDisposable().add(getDataManager()
                        .getDbHelper().getTv(idDetail.getValue())
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribe(response -> {
                            if (response.size() > 0) {
                                flagDetail.setValue(true);
                            } else {
                                flagDetail.setValue(false);
                            }
                            Log.i("CEK INSERT", String.valueOf(flagDetail.getValue()));
                        }, throwable -> {
                            flagDetail.setValue(false);
                        }));
                }
        }

        public void onBackArrowClick() {
            getNavigator().onBackArrowClick();
        }

        public void onFavClick() {
            if (flagScreen.getValue() == 1) {
                if (flagDetail.getValue()) {
                    getCompositeDisposable().add(getDataManager()
                            .getDbHelper().deleteMovie(idDetail.getValue())
                            .flatMap(aBoolean -> getDataManager().getDbHelper().deleteMovie(idDetail.getValue()))
                            .subscribeOn(getSchedulerProvider().io())
                            .observeOn(getSchedulerProvider().ui())
                            .subscribe(aBoolean -> {
                                getNavigator().onFavProcess(1);
                                flagDetail.setValue(false);
                                Log.i("CEK delete", String.valueOf(aBoolean));
                            }, throwable -> {
                                getNavigator().onFavProcess(1);
                            }));
                } else {
                    getCompositeDisposable().add(getDataManager()
                            .getDbHelper().saveMovie(movie)
                            .flatMap(aBoolean -> getDataManager().getDbHelper().saveMovie(movie))
                            .subscribeOn(getSchedulerProvider().io())
                            .observeOn(getSchedulerProvider().ui())
                            .subscribe(aBoolean -> {
                                getNavigator().onFavProcess(0);
                                flagDetail.setValue(true);
                                Log.i("CEK INSERT", String.valueOf(aBoolean));
                            }, throwable -> {
                                getNavigator().onFavProcess(0);
                            }));
                }
            }else {
                if (flagDetail.getValue()) {
                    getCompositeDisposable().add(getDataManager()
                            .getDbHelper().deleteTv(idDetail.getValue())
                            .flatMap(aBoolean -> getDataManager().getDbHelper().deleteMovie(idDetail.getValue()))
                            .subscribeOn(getSchedulerProvider().io())
                            .observeOn(getSchedulerProvider().ui())
                            .subscribe(aBoolean -> {
                                getNavigator().onFavProcess(1);
                                flagDetail.setValue(false);
                            }, throwable -> {
                                getNavigator().onFavProcess(1);
                            }));
                } else {
                    getCompositeDisposable().add(getDataManager()
                            .getDbHelper().saveTv(tvShow)
                            .flatMap(aBoolean -> getDataManager().getDbHelper().saveMovie(movie))
                            .subscribeOn(getSchedulerProvider().io())
                            .observeOn(getSchedulerProvider().ui())
                            .subscribe(aBoolean -> {
                                getNavigator().onFavProcess(0);
                                flagDetail.setValue(true);
                            }, throwable -> {
                                getNavigator().onFavProcess(0);
                            }));
                }
            }
        }


        public ObservableField<String> getOriginalName() {
            return originalName;
        }

        public ObservableField<String> getReleaseDate() {
            return releaseDate;
        }

        public ObservableField<String> getOverview() {
            return overview;
        }

        public ObservableField<String> getGenreMovie() {
            return genreMovie;
        }

        public ObservableField<String> getPosterPath() {
            return posterPath;
        }

        public ObservableField<String> getVoteAverage() {
            return voteAverage;
        }

        public MutableLiveData<Boolean> getFlagDetail() {

            return flagDetail;
        }

}
private void subscribeToLiveData () {
         movieViewModel.getMovieListLiveData (). observe (this, movieList -> {
             movieViewModel.setMovieDataList (movieList);
             adapter.setData (movieList);
         });
     }