Android 正在尝试从RecyclerView适配器检查房间数据库

Android 正在尝试从RecyclerView适配器检查房间数据库,android,android-recyclerview,adapter,android-room,Android,Android Recyclerview,Adapter,Android Room,我正在尝试从RecyclerView适配器插入、删除和检查我的房间数据库,但我无法正确完成,因为这就像适配器一直在重置项目一样 我正在寻找的基本功能是直接从RecyclerView适配器向DB添加一个项 即使我插入和删除数据库,我也不能保持我的切换按钮的状态处于选中状态或不处于选中状态,这取决于数据库中每个项目的存在 PS不要介意所有这些日志记录 这是我的适配器 public class MovieListRvAdapter extends RecyclerView.Adapter<M

我正在尝试从RecyclerView适配器插入、删除和检查我的房间数据库,但我无法正确完成,因为这就像适配器一直在重置项目一样

我正在寻找的基本功能是直接从RecyclerView适配器向DB添加一个项

即使我插入和删除数据库,我也不能保持我的切换按钮的状态处于选中状态或不处于选中状态,这取决于数据库中每个项目的存在

PS不要介意所有这些日志记录

这是我的适配器

public class MovieListRvAdapter extends RecyclerView.Adapter<MovieListRvAdapter.MoviesViewHolder>  {
private Context mContext;
private List<Movie> mMovies;
private static RvClickListener listener;
private boolean isInFavsAlready;
private static String LOG_TAG = MovieListRvAdapter.class.getSimpleName();

public interface RvClickListener{
     void rvClickListener(View v, int position);
}

public void swapData(List<Movie> movies)
{
    if(movies == null || movies.size()==0)
        return;
    if (mMovies != null && mMovies.size()>0)
        mMovies.clear();
    mMovies.addAll(movies);
    notifyDataSetChanged();
}

public MovieListRvAdapter(Context c, List<Movie> myMovieData, RvClickListener listener) {
    this.mContext = c;
    this.mMovies =myMovieData;
    this.listener = listener;

}

@NonNull
@Override
public MovieListRvAdapter.MoviesViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.movie_list_item;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;
    View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
    MoviesViewHolder viewHolder = new MoviesViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull MovieListRvAdapter.MoviesViewHolder holder, int position) {
    Movie movie = this.mMovies.get(position);
    Picasso.get()
            .load(movie.getPoster_path())
            .placeholder(R.drawable.ic_launcher_background)
            .error(R.drawable.ic_launcher_foreground)
            .into(holder.moviePosterIv);
    holder.movieTitleTv.setText(movie.getTitle());
    holder.ratingBar.setRating(Float.valueOf(movie.getVote_average())/2);
    holder.movieReleaseDateTv.setText(modifyDateLayout(movie.getRelease_date()));
     boolean bool =isMovieInFavorites(movie);
    Log.d(LOG_TAG, "isMovieInFavorites " +bool + " " +movie.getTitle());
    if(bool){
        holder.favButton.setChecked(true);

    }else{
        holder.favButton.setChecked(false);
    }
}

@Override
public int getItemCount() {
     return (null != mMovies ? mMovies.size() : 0);
}

/**
 * Cache of the children views for a list item.
 */
public class MoviesViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {
    ImageView moviePosterIv;
    TextView movieTitleTv;
    RatingBar ratingBar;
    TextView movieReleaseDateTv;
    ToggleButton favButton;

    public MoviesViewHolder(View itemView) {
        super(itemView);
        ratingBar = itemView.findViewById(R.id.rating);
        moviePosterIv = itemView.findViewById(R.id.poster_path);
        movieTitleTv = itemView.findViewById(R.id.movieTitleListItem);
        movieReleaseDateTv = itemView.findViewById(R.id.movieReleaseDate);
        favButton = itemView.findViewById(R.id.toggleButton);
        favButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int position = getLayoutPosition();
                final Movie movie = mMovies.get(position);
                if (isChecked && !isMovieInFavorites(movie)){
                final AppDatabase mDb = AppDatabase.getInstance(mContext);
                    Log.d(LOG_TAG, "isMovieInFavorites " +isMovieInFavorites(movie));
                AppExecutors.getInstance().diskIO().execute(new Runnable() {
                    @Override
                    public void run() {
                        mDb.movieDao().insertMovie(movie);
                        Log.d(LOG_TAG, " " + movie);
                    }
                });
                    favButton.setChecked(true);
                }
                else if (!isChecked){
                    final AppDatabase mDb = AppDatabase.getInstance(mContext);
                    AppExecutors.getInstance().diskIO().execute(new Runnable() {
                        @Override
                        public void run() {
                            mDb.movieDao().deleteMovie(movie);
                            Log.d(LOG_TAG, "movie deleted " + movie);
                        }
                    });
                    favButton.setChecked(false);
                }
            }
        });
        itemView.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        Context context = v.getContext();
        int clickedPosition = getAdapterPosition();
        Intent i = new Intent(context, MovieDetailsActivity.class);
        Movie movie = mMovies.get(clickedPosition);
        i.putExtra(MovieDetailsActivity.EXTRA_MOVIE, movie);
        context.startActivity(i);
        listener.rvClickListener(v, clickedPosition);
    }
}

public boolean isMovieInFavorites(Movie movie) {
    final AppDatabase mDb = AppDatabase.getInstance(mContext);
    AppExecutors.getInstance().diskIO().execute(new Runnable() {
        @Override
        public void run() {
            int dbMovieID = mDb.movieDao().searchFavsByMovieID(movie.getId());
            Log.d(LOG_TAG, "result of " + dbMovieID + " " + movie.getTitle());
            if(dbMovieID !=0){
                isInFavsAlready = true;

            }else{
                isInFavsAlready= false;
            }
        }
    });
公共类MovieListRvAdapter扩展了RecyclerView.Adapter{
私有上下文;
私人名单;
私有静态侦听器;
私有布尔值isInFavsAlready;
私有静态字符串LOG_TAG=MovieListRvAdapter.class.getSimpleName();
公共接口RvClickListener{
void rvClickListener(视图v,内部位置);
}
公共无效交换数据(列出电影)
{
如果(movies==null | | movies.size()==0)
返回;
如果(mMovies!=null&&mMovies.size()>0)
mMovies.clear();
mMovies.addAll(电影);
notifyDataSetChanged();
}
公共MovieListAdapter(上下文c、列表myMovieData、RvClickListener侦听器){
this.mContext=c;
this.mMovies=myMovieData;
this.listener=listener;
}
@非空
@凌驾
public MovieListRvAdapter.MoviesViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int viewType){
Context=viewGroup.getContext();
int layoutIdForListItem=R.layout.movie\u列表项;
LayoutFlater充气机=LayoutFlater.from(上下文);
布尔值shouldAttachToparentInstallent=false;
视图=充气机。充气(布局用于列表项、视图组,应立即附加到选项);
MoviesViewHolder viewHolder=新的MoviesViewHolder(视图);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(@NonNull MovieListRvAdapter.movieViewHolder,int位置){
电影=this.mMovies.get(位置);
毕加索
.load(movie.getPoster_path())
.占位符(R.drawable.ic_启动器_背景)
.错误(R.drawable.ic_启动器_前台)
.进入(电影发行人);
holder.movieTitleTv.setText(movie.getTitle());
holder.ratingBar.setRating(Float.valueOf(movie.getVote_average())/2);
holder.moviereleasedetv.setText(modifyDateLayout(movie.getRelease_date());
布尔布尔布尔=isMovieInFavorites(电影);
Log.d(Log_标记,“isMovieInFavorites”+bool+“”+movie.getTitle());
如果(bool){
holder.favButton.setChecked(true);
}否则{
holder.favButton.setChecked(假);
}
}
@凌驾
public int getItemCount(){
返回值(null!=mMovies?mMovies.size():0);
}
/**
*缓存列表项的子视图。
*/
公共类MoviesViewHolder扩展了RecyclerView.ViewHolder
实现View.OnClickListener{
ImageView moviePosterIv;
TextView电影电视;
比率杆比率杆;
TextView movieReleaseDateTv;
切换按钮FAV按钮;
公共电影视图持有者(视图项视图){
超级(项目视图);
ratingBar=itemView.findViewById(R.id.rating);
moviePosterIv=itemView.findviewbyd(R.id.poster\u路径);
movieTitleTv=itemView.findviewbyd(R.id.movieTitleListItem);
moviereleasedetv=itemView.findviewbyd(R.id.movieReleaseDate);
favButton=itemView.findviewbyd(R.id.toggleButton);
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int position=getLayoutPosition();
最终电影=mMovies.get(位置);
如果(被检查&!isMovieInFavorites(电影)){
最终的AppDatabase mDb=AppDatabase.getInstance(mContext);
Log.d(Log_标签,“isMovieInFavorites”+isMovieInFavorites(电影));
AppExecutors.getInstance().diskIO().execute(new Runnable()){
@凌驾
公开募捐{
mDb.movieDao().insertMovie(电影);
Log.d(Log_标签“”+电影);
}
});
favButton.setChecked(true);
}
否则,如果(!已检查){
最终的AppDatabase mDb=AppDatabase.getInstance(mContext);
AppExecutors.getInstance().diskIO().execute(new Runnable()){
@凌驾
公开募捐{
mDb.movieDao().deleteMovie(电影);
Log.d(日志标签,“电影删除”+电影);
}
});
favButton.setChecked(false);
}
}
});
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图v){
Context=v.getContext();
int clickedPosition=getAdapterPosition();
意图i=新意图(上下文、MovieDetailsActivity.class);
Movie Movie=mMovies.get(单击位置);
i、 putExtra(MovieDetailsActivity.EXTRA_MOVIE,MOVIE);
背景。起始触觉(i);
listener.rvClickListener(v,clickedPosition);
}
}
公共布尔isMovieInFavorites(电影){
最终的AppDatabase mDb=AppDatabase.getInstance(mContext);
AppExecutors.getInstance().diskIO().execute(new Runnable()){
@凌驾
公开募捐{
int dbMovieID=mDb.movieDao().searchFavsByMovieID(movie.getId());
Log.d(Log_标记,“+dbMovieID+”“+movie.getTitle()的结果);
如果(dbMovieID!=0){
isInFavsAlready=true;
}否则{
isInFavsAlready=false;
}
}
});
//Log.d(Log_标签,“方法1的结果”+isInFavsAlr
@Dao
public interface MovieDao {

@Query("SELECT * FROM moviesTable ORDER BY id")
LiveData<List<Movie>> loadAllMovies();

@Query("SELECT * FROM moviesTable WHERE id = :id")
LiveData<Movie> loadMovieById(int id);

@Query("SELECT id FROM moviesTable WHERE id = :id")
int searchFavsByMovieID(int id);

@Query("SELECT id FROM moviesTable WHERE id = :id")
LiveData<Integer> searchFavsByMovieIDLive(int id);

@Insert
void insertMovie(Movie movie);

@Query("DELETE FROM moviesTable WHERE movieId = :movieID")
void deleteByID(int movieID);

@Delete
void deleteMovie(Movie movie);
public boolean isFavoriteAlreadyInBackground(int movieId) {
    //  old code
    //    LiveData<Movie> movie = movieDao.getMovie(movieId);
    //    return movie.getValue() != null && movie.getValue().getFavorite();
        //new code
        Movie movie = movieDao.getMovie(movieId);
        return movie != null && movie.getFavorite();
    }
public void isMovieInFavorites(Movie movie) {
    final AppDatabase mDb = AppDatabase.getInstance(mContext);
    AppExecutors.getInstance().diskIO().execute(new Runnable() {
        @Override
        public void run() {
            int dbMovieID = mDb.movieDao().searchFavsByMovieID(movie.getId());
            Log.d(LOG_TAG, "result of " + dbMovieID + " " + movie.getTitle());
            if(dbMovieID !=0){
                isInFavsAlready = true;
                mContext.runOnUiThread(() -> {
                    holder.favButton.setChecked(true);
                }
            }else{
                isInFavsAlready= false;
                mContext.runOnUiThread(() -> {
                    holder.favButton.setChecked(false);
                }
            }

        }
    });
}