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